Changed void * into char * for offset calculations to make things portable
[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 /* $Id$ */
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14 # include "irmode_t.h"
15 # include <malloc.h>
16 # include <stddef.h>
17 # include <string.h>
18 # include "tv.h"
19
20 ir_mode *mode_T;
21 ir_mode *mode_F;
22 ir_mode *mode_D;
23 ir_mode *mode_E;
24 ir_mode *mode_Bs;
25 ir_mode *mode_Bu;
26 ir_mode *mode_Hs;
27 ir_mode *mode_Hu;
28 ir_mode *mode_Is;
29 ir_mode *mode_Iu;
30 ir_mode *mode_Ls;
31 ir_mode *mode_Lu;
32 ir_mode *mode_C;
33 ir_mode *mode_U;
34 ir_mode *mode_b;
35 ir_mode *mode_P;
36 ir_mode *mode_X;
37 ir_mode *mode_M;
38 ir_mode *mode_BB;
39
40 INLINE ir_mode *get_modeT() { return mode_T; }
41 INLINE ir_mode *get_modeF() { return mode_F; }
42 INLINE ir_mode *get_modeD() { return mode_D; }
43 INLINE ir_mode *get_modeE() { return mode_E; }
44 INLINE ir_mode *get_modeBs() { return mode_Bs; }
45 INLINE ir_mode *get_modeBu() { return mode_Bu; }
46 INLINE ir_mode *get_modeHs() { return mode_Hs; }
47 INLINE ir_mode *get_modeHu() { return mode_Hu; }
48 INLINE ir_mode *get_modeIs() { return mode_Is; }
49 INLINE ir_mode *get_modeIu() { return mode_Iu; }
50 INLINE ir_mode *get_modeLs() { return mode_Ls; }
51 INLINE ir_mode *get_modeLu() { return mode_Lu; }
52 INLINE ir_mode *get_modeC() { return mode_C; }
53 INLINE ir_mode *get_modeU() { return mode_U; }
54 INLINE ir_mode *get_modeb() { return mode_b; }
55 INLINE ir_mode *get_modeP() { return mode_P; }
56 INLINE ir_mode *get_modeX() { return mode_X; }
57 INLINE ir_mode *get_modeM() { return mode_M; }
58 INLINE ir_mode *get_modeBB() { return mode_BB; }
59
60 void
61 init_mode (void)
62 {
63   /* allocate all modes. We need to memset them as tarval_vrfy
64      reads fields before they are initialized: It compares to
65      min/max when tarvals for min/max are allocated!  */
66   mode_T  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_T, 0, sizeof(ir_mode));
67   mode_F  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_F, 0, sizeof(ir_mode));
68   mode_D  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_D, 0, sizeof(ir_mode));
69   mode_E  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_E, 0, sizeof(ir_mode));
70   mode_Bs = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Bs, 0, sizeof(ir_mode));
71   mode_Bu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Bu, 0, sizeof(ir_mode));
72   mode_Hs = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Hs, 0, sizeof(ir_mode));
73   mode_Hu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Hu, 0, sizeof(ir_mode));
74   mode_Is = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Is, 0, sizeof(ir_mode));
75   mode_Iu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Iu, 0, sizeof(ir_mode));
76   mode_Ls = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Ls, 0, sizeof(ir_mode));
77   mode_Lu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Lu, 0, sizeof(ir_mode));
78   mode_C  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_C, 0, sizeof(ir_mode));
79   mode_U  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_U, 0, sizeof(ir_mode));
80   mode_b  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_b, 0, sizeof(ir_mode));
81   mode_P  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_P, 0, sizeof(ir_mode));
82   mode_X  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_X, 0, sizeof(ir_mode));
83   mode_M  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_M, 0, sizeof(ir_mode));
84   mode_BB = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_BB, 0, sizeof(ir_mode));
85
86   mode_T->code = irm_T;
87   mode_F->code = irm_F;
88   mode_D->code = irm_D;
89   mode_E->code = irm_E;
90   mode_Bs->code = irm_Bs;
91   mode_Bu->code = irm_Bu;
92   mode_Hs->code = irm_Hs;
93   mode_Hu->code = irm_Hu;
94   mode_Is->code = irm_Is;
95   mode_Iu->code = irm_Iu;
96   mode_Ls->code = irm_Ls;
97   mode_Lu->code = irm_Lu;
98   mode_C->code = irm_C;
99   mode_U->code = irm_U;
100   mode_b->code = irm_b;
101   mode_P->code = irm_P;
102   mode_X->code = irm_X;
103   mode_M->code = irm_M;
104   mode_BB->code = irm_BB;
105
106   /* initialize all modes */
107
108   mode_T->name = id_from_str ("T", 1);
109   mode_T->fsigned = 0;
110   mode_T->ffloat = 0;
111
112   /* float */
113   mode_F->name = id_from_str ("F", 1);
114   mode_F->fsigned = 1;
115   mode_F->ffloat = 1;
116   mode_F->ld_align = 4;
117   mode_F->size = 4;
118
119   /* double */
120   mode_D->name = id_from_str ("D", 1);
121   mode_D->fsigned = 1;
122   mode_D->ffloat = 1;
123   mode_D->ld_align = 4;
124   mode_D->size = 8;
125
126   /* extended */
127   mode_E->name = id_from_str ("E", 1);
128   mode_E->fsigned = 1;
129   mode_E->ffloat = 1;
130   mode_E->ld_align = 4;
131   mode_E->size = 12;
132
133   /* signed byte */
134   mode_Bs->name = id_from_str ("Bs", 1);
135   mode_Bs->fsigned = 1;
136   mode_Bs->ffloat = 0;
137   mode_Bs->ld_align = 1;
138   mode_Bs->size = 1;
139   mode_Bs->min = tarval_from_long (mode_Ls, 0xffffff80);
140   mode_Bs->max = tarval_from_long (mode_Ls, 0x0000007f);
141   mode_Bs->null = tarval_from_long (mode_Bs, 0);
142
143   /* unsigned byte */
144   mode_Bu->name = id_from_str ("Bu", 1);
145   mode_Bu->fsigned = 0;
146   mode_Bu->ffloat = 0;
147   mode_Bu->ld_align = 1;
148   mode_Bu->size = 1;
149   mode_Bu->min = tarval_from_long (mode_Lu, 0x00000000);
150   mode_Bu->max = tarval_from_long (mode_Lu, 0x000000ff);
151   mode_Bu->null = tarval_from_long (mode_Bu, 0);
152
153   /* signed short integer */
154   mode_Hs->name = id_from_str ("Hs", 1);
155   mode_Hs->fsigned = 1;
156   mode_Hs->ffloat = 0;
157   mode_Hs->ld_align = 2;
158   mode_Hs->size = 2;
159   mode_Hs->min = tarval_from_long (mode_Ls, 0xffff8000);
160   mode_Hs->max = tarval_from_long (mode_Ls, 0x00007fff);
161   mode_Hs->null = tarval_from_long (mode_Hs, 0);
162
163   /* unsigned short integer */
164   mode_Hu->name = id_from_str ("Hu", 1);
165   mode_Hu->fsigned = 0;
166   mode_Hu->ffloat = 0;
167   mode_Hu->ld_align = 2;
168   mode_Hu->size = 2;
169   mode_Hu->min = tarval_from_long (mode_Lu, 0x00000000);
170   mode_Hu->max = tarval_from_long (mode_Lu, 0x0000ffff);
171   mode_Hu->null = tarval_from_long (mode_Hu, 0);
172
173   /* signed integer */
174   mode_Is->name = id_from_str ("Is", 1);
175   mode_Is->fsigned = 1;
176   mode_Is->ffloat = 0;
177   mode_Is->ld_align = 4;
178   mode_Is->size = 4;
179   mode_Is->min = tarval_from_long (mode_Ls, 0x80000000);
180   mode_Is->max = tarval_from_long (mode_Ls, 0x7fffffff);
181   mode_Is->null = tarval_from_long (mode_Is, 0);
182
183   /* unsigned integer */
184   mode_Iu->name = id_from_str ("Iu", 1);
185   mode_Iu->fsigned = 0;
186   mode_Iu->ffloat = 0;
187   mode_Iu->ld_align = 4;
188   mode_Iu->size = 4;
189   mode_Iu->min = tarval_from_long (mode_Lu, 0x00000000);
190   mode_Iu->max = tarval_from_long (mode_Lu, 0xffffffff);
191   mode_Iu->null = tarval_from_long (mode_Iu, 0);
192
193   /* signed long integer */
194   mode_Ls->name = id_from_str ("Ls", 1);
195   mode_Ls->fsigned = 1;
196   mode_Ls->ffloat = 0;
197   mode_Ls->ld_align = 8;
198   mode_Ls->size = 8;
199   mode_Ls->min = tarval_from_long (mode_Ls, 0x80000000);
200   mode_Ls->max = tarval_from_long (mode_Ls, 0x7fffffff);
201   mode_Ls->null = tarval_from_long (mode_Ls, 0);
202
203   /* unsigned long integer */
204   mode_Lu->name = id_from_str ("Lu", 1);
205   mode_Lu->fsigned = 0;
206   mode_Lu->ffloat = 0;
207   mode_Lu->ld_align = 8;
208   mode_Lu->size = 8;
209   mode_Lu->min = tarval_from_long (mode_Lu, 0x00000000);
210   mode_Lu->max = tarval_from_long (mode_Lu, 0xffffffff);
211   mode_Lu->null = tarval_from_long (mode_Lu, 0);
212
213   /* character */
214   mode_C->name = id_from_str ("C", 1);
215   mode_C->fsigned = 0;
216   mode_C->ffloat = 0;
217   mode_C->ld_align = 1;
218   mode_C->size = 1;
219   mode_C->min = tarval_from_long (mode_Ls, 0xffffff80);
220   mode_C->max = tarval_from_long (mode_Ls, 0x0000007f);
221   mode_C->null = tarval_from_long (mode_C, 0);
222
223   /* unicode character */
224   mode_C->name = id_from_str ("U", 1);
225   mode_C->fsigned = 0;
226   mode_C->ffloat = 0;
227   mode_C->ld_align = 1;
228   mode_C->size = 2;
229   mode_C->min = tarval_from_long (mode_Ls, 0xffff8000);
230   mode_C->max = tarval_from_long (mode_Ls, 0x00007fff);
231   mode_C->null = tarval_from_long (mode_U, 0);
232
233   /* boolean */
234   mode_b->name = id_from_str ("b", 1);
235   mode_b->fsigned = 0;
236   mode_b->ffloat = 0;
237
238   /* pointer */
239   mode_P->name = id_from_str ("P", 1);
240   mode_P->fsigned = 0;
241   mode_P->ffloat = 0;
242   mode_P->ld_align = 4;
243   mode_P->size = 4;
244   mode_P->min = tarval_from_long (mode_Lu, 0x00000000);
245   mode_P->max = tarval_from_long (mode_Lu, 0xffffffff);
246   mode_P->null = tarval_from_long (mode_P, 0);
247
248   /* Execution */
249   mode_X->name = id_from_str ("X", 1);
250   mode_X->fsigned = 0;
251   mode_X->ffloat = 0;
252
253   /* Memory */
254   mode_M->name = id_from_str ("M", 1);
255   mode_M->fsigned = 0;
256   mode_M->ffloat = 0;
257
258   mode_BB->name = id_from_str ("BB", 1);
259   mode_BB->fsigned = 0;
260   mode_BB->ffloat = 0;
261 }
262
263 /* Functions for the direct access to all attributes od a ir_mode */
264
265 modecode
266 get_mode_modecode (ir_mode *mode)
267 {
268   return mode->code;
269 }
270
271 /*
272 INLINE void
273 set_mode_modecode (ir_mode *mode, modecode code)
274 {
275   mode->code = code;
276 }
277 */
278
279 ident *
280 get_mode_ident (ir_mode *mode)
281 {
282   return mode->name;
283 }
284
285 /*
286 INLINE void
287 set_mode_ident (ir_mode *mode, ident *name)
288 {
289   mode->name = name;
290 }
291 */
292
293 INLINE const char *
294 get_mode_name       (ir_mode *mode) {
295   assert(mode);
296   return id_to_str(mode->name);
297 }
298 /* void  set_mode_name       (ir_mode *mode, char *name);    */
299
300 int
301 get_mode_size (ir_mode *mode)
302 {
303   return mode->size;
304 }
305 /*
306 INLINE void
307 set_mode_size (ir_mode *mode, int size)
308 {
309   mode->size = size;
310 }
311 */
312
313 int
314 get_mode_ld_align (ir_mode *mode)
315 {
316   return mode->ld_align;
317 }
318
319 /*
320 INLINE void
321 set_mode_ld_align (ir_mode *mode, int ld_align)
322 {
323   mode->ld_align = ld_align;
324 }
325 */
326
327 tarval *
328 get_mode_min (ir_mode *mode)
329 {
330   return mode->min;
331 }
332
333 /*
334 INLINE void
335 set_mode_min (ir_mode *mode, tarval *min)
336 {
337 mode->min = min;
338 }
339 */
340
341 tarval *
342 get_mode_max (ir_mode *mode)
343 {
344   return mode->max;
345 }
346
347 /*
348 INLINE void
349 set_mode_max (ir_mode *mode, tarval *max)
350 {
351   mode->max = max;
352 }
353 */
354
355 tarval *
356 get_mode_null (ir_mode *mode)
357 {
358   return mode->null;
359 }
360
361 /*
362 INLINE void
363 set_mode_null (ir_mode *mode, tarval *null)
364 {
365   mode->null = null;
366 }
367 */
368
369 unsigned
370 get_mode_fsigned (ir_mode *mode)
371 {
372   return mode->fsigned;
373 }
374
375 /*
376 INLINE voida
377 set_mode_fsigned (ir_mode *mode, unsigned fsigned)
378 {
379   mode->fsigned = fsigned;
380 }
381 */
382
383 unsigned
384 get_mode_ffloat (ir_mode *mode)
385 {
386   return mode->ffloat;
387 }
388
389 /*
390 INLINE void
391 set_mode_ffloat (ir_mode *mode, unsigned ffloat)
392 {
393   mode->ffloat = ffloat;
394 }
395 */
396
397 /* Functions to check, whether a modecode is signed, float, int, num, data,
398    datab or dataM. For more exact definitions read the corresponding pages
399    in the firm documentation or the followingenumeration
400
401    The set of "float" is defined as:
402    ---------------------------------
403    float = {irm_F, irm_D, irm_E}
404
405    The set of "int" is defined as:
406    -------------------------------
407    int   = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
408
409    The set of "num" is defined as:
410    -------------------------------
411    num   = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
412             irm_Is, irm_Iu, irm_Ls, irm_Lu}
413             = {float || int}
414
415    The set of "data" is defined as:
416    -------------------------------
417    data  = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
418             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_p}
419             = {num || irm_C || irm_P}
420
421    The set of "datab" is defined as:
422    ---------------------------------
423    datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
424             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
425             = {data || irm_b }
426
427    The set of "dataM" is defined as:
428    ---------------------------------
429    dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
430             irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
431             = {data || irm_M}
432 */
433
434 int
435 mode_is_signed (ir_mode *mode)
436 {
437    int res;
438    unsigned fsigned;
439    fsigned = get_mode_fsigned (mode);
440    if (fsigned == 1) {
441      res = 1;
442     }
443    else {
444      res = 0;
445    }
446    return res;
447 }
448
449 INLINE int
450 mode_is_float (ir_mode *mode)
451 {
452    int res;
453    unsigned ffloat;
454    ffloat = get_mode_ffloat (mode);
455    if (ffloat == 1) {
456       res = 1;
457     }
458    else {
459      res = 0;
460    }
461    return res;
462 }
463
464
465 INLINE int
466 mode_is_int (ir_mode *mode)
467 {
468    int res;
469    modecode code;
470    code = get_mode_modecode (mode);
471    if ((code >= irm_Bs) &&  (code <= irm_Lu)) {
472       res = 1;
473     }
474    else {
475      res = 0;
476    }
477    return res;
478 }
479
480
481 INLINE int
482 mode_is_num (ir_mode *mode)
483 {
484   int res;
485   if (mode_is_int (mode) || mode_is_float (mode)) {
486     res = 1;
487   }
488   else {
489     res = 0;
490   }
491   return res;
492 }
493
494 INLINE int
495 mode_is_data (ir_mode *mode)
496 {
497   int res;
498   modecode code;
499   code = get_mode_modecode (mode);
500   if (mode_is_num (mode) ||
501       code == irm_C || code == irm_U || code == irm_P) {
502     res = 1;
503   }
504   else {
505     res = 0;
506   }
507   return res;
508 }
509
510 int
511 mode_is_datab (ir_mode *mode)
512 {
513   int res;
514   modecode code;
515   code = get_mode_modecode (mode);
516   if (mode_is_data (mode) || code == irm_b ) {
517     res = 1;
518   }
519   else {
520     res = 0;
521   }
522   return res;
523 }
524
525 int
526 mode_is_dataM (ir_mode *mode)
527 {
528   int res;
529   modecode code;
530   code = get_mode_modecode (mode);
531   if (mode_is_data (mode) || code == irm_M) {
532     res = 1;
533   }
534   else {
535     res = 0;
536   }
537   return res;
538 }
539
540 /* Returns true if sm can be converted to lm without loss. */
541 bool
542 smaller_mode(ir_mode *sm, ir_mode *lm) {
543   if ((mode_is_int(sm) && mode_is_int(lm)) &&
544       get_mode_modecode(sm) <= get_mode_modecode(lm))
545     return true;
546   if ((mode_is_float(sm) && mode_is_float(lm)) &&
547       get_mode_modecode(sm) <= get_mode_modecode(lm))
548     return true;
549   return(false);
550 }