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