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