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