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