Added exception markings to graph and cfg dumps --flo
[libfirm] / ir / ir / irmode.c
1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
3 **
4 ** Authors: Martin Trapp, Christian Schaefer
5 **
6 */
7
8 /* $Id$ */
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14 # include "irmode_t.h"
15 # include <malloc.h>
16 # include <stddef.h>
17 # include "tv.h"
18
19 ir_mode *mode_T;
20 ir_mode *mode_f;
21 ir_mode *mode_d;
22 ir_mode *mode_c;
23 ir_mode *mode_C;
24 ir_mode *mode_h;
25 ir_mode *mode_H;
26 ir_mode *mode_i;
27 ir_mode *mode_I;
28 ir_mode *mode_l;
29 ir_mode *mode_L;
30 ir_mode *mode_B;
31 ir_mode *mode_b;
32 ir_mode *mode_p;
33 ir_mode *mode_s;
34 ir_mode *mode_S;
35 ir_mode *mode_X;
36 ir_mode *mode_M;
37 ir_mode *mode_R;
38 ir_mode *mode_Z;
39
40 void
41 init_mode (void)
42 {
43   /* allocate all modes. We need to memset them as tarval_vrfy
44      reads fields before they are initialized: It compares to
45      min/max when tarvals for min/max are allocated!  */
46   mode_T = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_T, 0, sizeof(ir_mode));
47   mode_f = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_f, 0, sizeof(ir_mode));
48   mode_d = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_d, 0, sizeof(ir_mode));
49   mode_c = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_c, 0, sizeof(ir_mode));
50   mode_C = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_C, 0, sizeof(ir_mode));
51   mode_h = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_h, 0, sizeof(ir_mode));
52   mode_H = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_H, 0, sizeof(ir_mode));
53   mode_i = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_i, 0, sizeof(ir_mode));
54   mode_I = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_I, 0, sizeof(ir_mode));
55   mode_l = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_l, 0, sizeof(ir_mode));
56   mode_L = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_L, 0, sizeof(ir_mode));
57   mode_B = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_B, 0, sizeof(ir_mode));
58   mode_b = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_b, 0, sizeof(ir_mode));
59   mode_p = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_p, 0, sizeof(ir_mode));
60   mode_s = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_s, 0, sizeof(ir_mode));
61   mode_S = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_S, 0, sizeof(ir_mode));
62   mode_X = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_X, 0, sizeof(ir_mode));
63   mode_M = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_M, 0, sizeof(ir_mode));
64   mode_R = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_R, 0, sizeof(ir_mode));
65   mode_Z = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Z, 0, sizeof(ir_mode));
66
67   mode_T->code = irm_T;
68   mode_f->code = irm_f;
69   mode_d->code = irm_d;
70   mode_c->code = irm_c;
71   mode_C->code = irm_C;
72   mode_h->code = irm_h;
73   mode_H->code = irm_H;
74   mode_i->code = irm_i;
75   mode_I->code = irm_I;
76   mode_l->code = irm_l;
77   mode_L->code = irm_L;
78   mode_B->code = irm_B;
79   mode_b->code = irm_b;
80   mode_p->code = irm_p;
81   mode_s->code = irm_s;
82   mode_S->code = irm_S;
83   mode_X->code = irm_X;
84   mode_M->code = irm_M;
85   mode_R->code = irm_R;
86   mode_Z->code = irm_Z;
87
88   /* initialize all modes */
89
90   mode_T->name = id_from_str ("T", 1);
91   mode_T->fsigned = 0;
92   mode_T->ffloat = 0;
93
94   /* float */
95   mode_f->name = id_from_str ("f", 1);
96   mode_f->fsigned = 1;
97   mode_f->ffloat = 1;
98   mode_f->ld_align = 4;
99   mode_f->size = 4;
100
101   /* double */
102   mode_d->name = id_from_str ("d", 1);
103   mode_d->fsigned = 1;
104   mode_d->ffloat = 1;
105   mode_d->ld_align = 4;
106   mode_d->size = 8;
107
108   /* signed char */
109   mode_c->name = id_from_str ("c", 1);
110   mode_c->fsigned = 1;
111   mode_c->ffloat = 0;
112   mode_c->ld_align = 1;
113   mode_c->size = 1;
114   mode_c->min = tarval_from_long (mode_l, 0xffffff80);
115   mode_c->max = tarval_from_long (mode_l, 0x0000007f);
116   mode_c->null = tarval_from_long (mode_c, 0);
117
118   /* unsigned char */
119   mode_C->name = id_from_str ("C", 1);
120   mode_C->fsigned = 0;
121   mode_C->ffloat = 0;
122   mode_C->ld_align = 1;
123   mode_C->size = 1;
124   mode_C->min = tarval_from_long (mode_L, 0x00000000);
125   mode_C->max = tarval_from_long (mode_L, 0x000000ff);
126   mode_C->null = tarval_from_long (mode_C, 0);
127
128   /* signed short integer */
129   mode_h->name = id_from_str ("h", 1);
130   mode_h->fsigned = 1;
131   mode_h->ffloat = 0;
132   mode_h->ld_align = 2;
133   mode_h->size = 2;
134   mode_h->min = tarval_from_long (mode_l, 0xffff8000);
135   mode_h->max = tarval_from_long (mode_l, 0x00007fff);
136   mode_h->null = tarval_from_long (mode_h, 0);
137
138   /* unsigened short integer */
139   mode_H->name = id_from_str ("H", 1);
140   mode_H->fsigned = 0;
141   mode_H->ffloat = 0;
142   mode_H->ld_align = 2;
143   mode_H->size = 2;
144   mode_H->min = tarval_from_long (mode_L, 0x00000000);
145   mode_H->max = tarval_from_long (mode_L, 0x0000ffff);
146   mode_H->null = tarval_from_long (mode_H, 0);
147
148   /* signed integer */
149   mode_i->name = id_from_str ("i", 1);
150   mode_i->fsigned = 1;
151   mode_i->ffloat = 0;
152   mode_i->ld_align = 4;
153   mode_i->size = 4;
154   mode_i->min = tarval_from_long (mode_l, 0x80000000);
155   mode_i->max = tarval_from_long (mode_l, 0x7fffffff);
156   mode_i->null = tarval_from_long (mode_i, 0);
157
158   /* unsigned integer */
159   mode_I->name = id_from_str ("I", 1);
160   mode_I->fsigned = 0;
161   mode_I->ffloat = 0;
162   mode_I->ld_align = 4;
163   mode_I->size = 4;
164   mode_I->min = tarval_from_long (mode_L, 0x00000000);
165   mode_I->max = tarval_from_long (mode_L, 0xffffffff);
166   mode_I->null = tarval_from_long (mode_I, 0);
167
168   /* signed long integer */
169   mode_l->name = id_from_str ("l", 1);
170   mode_l->fsigned = 1;
171   mode_l->ffloat = 0;
172   mode_l->ld_align = 4;
173   mode_l->size = 4;
174   mode_l->min = tarval_from_long (mode_l, 0x80000000);
175   mode_l->max = tarval_from_long (mode_l, 0x7fffffff);
176   mode_I->null = tarval_from_long (mode_l, 0);
177
178   /* unsigned long integer */
179   mode_L->name = id_from_str ("L", 1);
180   mode_L->fsigned = 0;
181   mode_L->ffloat = 0;
182   mode_L->ld_align = 4;
183   mode_L->size = 4;
184   mode_L->min = tarval_from_long (mode_L, 0x00000000);
185   mode_L->max = tarval_from_long (mode_L, 0xffffffff);
186   mode_L->null = tarval_from_long (mode_L, 0);
187
188   /* universal bits */
189   mode_B->name = id_from_str ("B", 1);
190   mode_B->fsigned = 0;
191   mode_B->ffloat = 0;
192
193   /* boolean */
194   mode_b->name = id_from_str ("b", 1);
195   mode_b->fsigned = 0;
196   mode_b->ffloat = 0;
197
198   /* pointer */
199   mode_p->name = id_from_str ("p", 1);
200   mode_p->fsigned = 0;
201   mode_p->ffloat = 0;
202   mode_p->ld_align = 4;
203   mode_p->size = 4;
204   mode_p->min = tarval_from_long (mode_L, 0x00000000);
205   mode_p->max = tarval_from_long (mode_L, 0xffffffff);
206   mode_p->null = tarval_from_long (mode_p, 0);
207
208   mode_s->name = id_from_str ("s", 1);
209   mode_s->fsigned = 0;
210   mode_s->ffloat = 0;
211
212   mode_S->name = id_from_str ("S", 1);
213   mode_S->fsigned = 0;
214   mode_S->ffloat = 0;
215
216   /* Execution */
217   mode_X->name = id_from_str ("X", 1);
218   mode_X->fsigned = 0;
219   mode_X->ffloat = 0;
220
221   /* Memory */
222   mode_M->name = id_from_str ("M", 1);
223   mode_M->fsigned = 0;
224   mode_M->ffloat = 0;
225
226   mode_R->name = id_from_str ("R", 1);
227   mode_R->fsigned = 0;
228   mode_R->ffloat = 0;
229
230   mode_Z->name = id_from_str ("Z", 1);
231   mode_Z->fsigned = 1;
232   mode_Z->ffloat = 0;
233 }
234
235 /* Functions for the direct access to all attributes od a ir_mode */
236
237 modecode
238 get_mode_modecode (ir_mode *mode)
239 {
240   return mode->code;
241 }
242
243 /*
244 inline void
245 set_mode_modecode (ir_mode *mode, modecode code)
246 {
247   mode->code = code;
248 }
249 */
250
251 ident *
252 get_mode_ident (ir_mode *mode)
253 {
254   return mode->name;
255 }
256
257 /*
258 inline void
259 set_mode_ident (ir_mode *mode, ident *name)
260 {
261   mode->name = name;
262 }
263 */
264
265 inline const char *
266 get_mode_name       (ir_mode *mode) {
267   assert(mode);
268   return id_to_str(mode->name);
269 }
270 /* void  set_mode_name       (ir_mode *mode, char *name);    */
271
272 int
273 get_mode_size (ir_mode *mode)
274 {
275   return mode->size;
276 }
277 /*
278 inline void
279 set_mode_size (ir_mode *mode, int size)
280 {
281   mode->size = size;
282 }
283 */
284
285 int
286 get_mode_ld_align (ir_mode *mode)
287 {
288   return mode->ld_align;
289 }
290
291 /*
292 inline void
293 set_mode_ld_align (ir_mode *mode, int ld_align)
294 {
295   mode->ld_align = ld_align;
296 }
297 */
298
299 tarval *
300 get_mode_min (ir_mode *mode)
301 {
302   return mode->min;
303 }
304
305 /*
306 inline void
307 set_mode_min (ir_mode *mode, tarval *min)
308 {
309 mode->min = min;
310 }
311 */
312
313 tarval *
314 get_mode_max (ir_mode *mode)
315 {
316   return mode->max;
317 }
318
319 /*
320 inline void
321 set_mode_max (ir_mode *mode, tarval *max)
322 {
323   mode->max = max;
324 }
325 */
326
327 tarval *
328 get_mode_null (ir_mode *mode)
329 {
330   return mode->null;
331 }
332
333 /*
334 inline void
335 set_mode_null (ir_mode *mode, tarval *null)
336 {
337   mode->null = null;
338 }
339 */
340
341 unsigned
342 get_mode_fsigned (ir_mode *mode)
343 {
344   return mode->fsigned;
345 }
346
347 /*
348 inline voida
349 set_mode_fsigned (ir_mode *mode, unsigned fsigned)
350 {
351   mode->fsigned = fsigned;
352 }
353 */
354
355 unsigned
356 get_mode_ffloat (ir_mode *mode)
357 {
358   return mode->ffloat;
359 }
360
361 /*
362 inline void
363 set_mode_ffloat (ir_mode *mode, unsigned ffloat)
364 {
365   mode->ffloat = ffloat;
366 }
367 */
368
369 /* Functions to check, whether a modecode is signed, float, int, num, data,
370    datab or dataM. For more exact definitions read the corresponding pages
371    in the firm documentation or the followingenumeration
372
373    The set of "float" is defined as:
374    ---------------------------------
375    float = {irm_f, irm_d}
376
377    The set of "int" is defined as:
378    -------------------------------
379    int   = {irm_c, irm_C, irm_h, irm_H, irm_i, irm_I, irm_l, irm_L}
380
381    The set of "num" is defined as:
382    -------------------------------
383    num   = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H,
384             irm_i, irm_I, irm_l, irm_L}
385             = {float || int}
386
387    The set of "data" is defined as:
388    -------------------------------
389    data  = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H,
390             irm_i, irm_I, irm_l, irm_L, irm_p}
391             = {num || irm_p}
392
393    The set of "datab" is defined as:
394    ---------------------------------
395    datab = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H,
396             irm_i, irm_I, irm_l, irm_L, irm_p, irm_b, irm_B}
397             = {data || irm_b || irm_B}
398
399    The set of "dataM" is defined as:
400    ---------------------------------
401    dataM = {irm_f, irm_d, irm_c, irm_C, irm_h, irm_H, irm_i,
402             irm_I, irm_l, irm_L, irm_p, irm_M}
403             = {data || irm_M}
404 */
405
406 int
407 mode_is_signed (ir_mode *mode)
408 {
409    int res;
410    unsigned fsigned;
411    fsigned = get_mode_fsigned (mode);
412    if (fsigned == 1) {
413      res = 1;
414     }
415    else {
416      res = 0;
417    }
418    return res;
419 }
420
421 int
422 mode_is_float (ir_mode *mode)
423 {
424    int res;
425    unsigned ffloat;
426    ffloat = get_mode_ffloat (mode);
427    if (ffloat == 1) {
428       res = 1;
429     }
430    else {
431      res = 0;
432    }
433    return res;
434 }
435
436
437 int
438 mode_is_int (ir_mode *mode)
439 {
440    int res;
441    modecode code;
442    code = get_mode_modecode (mode);
443    if ((code >= irm_c) &&  (code <= irm_L)) {
444       res = 1;
445     }
446    else {
447      res = 0;
448    }
449    return res;
450 }
451
452
453 int
454 mode_is_num (ir_mode *mode)
455 {
456   int res;
457   if (mode_is_int (mode) || mode_is_float (mode)) {
458     res = 1;
459   }
460   else {
461     res = 0;
462   }
463   return res;
464 }
465
466 int
467 mode_is_data (ir_mode *mode)
468 {
469   int res;
470   modecode code;
471   code = get_mode_modecode (mode);
472   if (mode_is_num (mode) || code == irm_p) {
473     res = 1;
474   }
475   else {
476     res = 0;
477   }
478   return res;
479 }
480
481 int
482 mode_is_datab (ir_mode *mode)
483 {
484   int res;
485   modecode code;
486   code = get_mode_modecode (mode);
487   if (mode_is_data (mode) || code == irm_b || code == irm_B) {
488     res = 1;
489   }
490   else {
491     res = 0;
492   }
493   return res;
494 }
495
496 int
497 mode_is_dataM (ir_mode *mode)
498 {
499   int res;
500   modecode code;
501   code = get_mode_modecode (mode);
502   if (mode_is_data (mode) || code == irm_M) {
503     res = 1;
504   }
505   else {
506     res = 0;
507   }
508   return res;
509 }