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