Added access routines to external variables.
[libfirm] / ir / ir / irmode.c
index 3f9ddc8..5b9e024 100644 (file)
@@ -5,6 +5,8 @@
 **
 */
 
+/* $Id$ */
+
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
@@ -12,6 +14,7 @@
 # include "irmode_t.h"
 # include <malloc.h>
 # include <stddef.h>
+# include <string.h>
 # include "tv.h"
 
 ir_mode *mode_T;
@@ -35,6 +38,27 @@ ir_mode *mode_M;
 ir_mode *mode_R;
 ir_mode *mode_Z;
 
+INLINE ir_mode *get_mode_T() { return mode_T; }
+INLINE ir_mode *get_mode_f() { return mode_f; }
+INLINE ir_mode *get_mode_d() { return mode_d; }
+INLINE ir_mode *get_mode_c() { return mode_c; }
+INLINE ir_mode *get_mode_C() { return mode_C; }
+INLINE ir_mode *get_mode_h() { return mode_h; }
+INLINE ir_mode *get_mode_H() { return mode_H; }
+INLINE ir_mode *get_mode_i() { return mode_i; }
+INLINE ir_mode *get_mode_I() { return mode_I; }
+INLINE ir_mode *get_mode_l() { return mode_l; }
+INLINE ir_mode *get_mode_L() { return mode_L; }
+INLINE ir_mode *get_mode_B() { return mode_B; }
+INLINE ir_mode *get_mode_p() { return mode_b; }
+INLINE ir_mode *get_mode_b() { return mode_p; }
+INLINE ir_mode *get_mode_s() { return mode_s; }
+INLINE ir_mode *get_mode_S() { return mode_S; }
+INLINE ir_mode *get_mode_X() { return mode_X; }
+INLINE ir_mode *get_mode_M() { return mode_M; }
+INLINE ir_mode *get_mode_R() { return mode_R; }
+INLINE ir_mode *get_mode_Z() { return mode_Z; }
+
 void
 init_mode (void)
 {
@@ -93,17 +117,21 @@ init_mode (void)
   mode_f->name = id_from_str ("f", 1);
   mode_f->fsigned = 1;
   mode_f->ffloat = 1;
+  mode_f->ld_align = 4;
+  mode_f->size = 4;
 
   /* double */
   mode_d->name = id_from_str ("d", 1);
   mode_d->fsigned = 1;
   mode_d->ffloat = 1;
+  mode_d->ld_align = 4;
+  mode_d->size = 8;
 
   /* signed char */
   mode_c->name = id_from_str ("c", 1);
   mode_c->fsigned = 1;
   mode_c->ffloat = 0;
-  mode_c->ld_align = 0;
+  mode_c->ld_align = 1;
   mode_c->size = 1;
   mode_c->min = tarval_from_long (mode_l, 0xffffff80);
   mode_c->max = tarval_from_long (mode_l, 0x0000007f);
@@ -113,7 +141,7 @@ init_mode (void)
   mode_C->name = id_from_str ("C", 1);
   mode_C->fsigned = 0;
   mode_C->ffloat = 0;
-  mode_C->ld_align = 0;
+  mode_C->ld_align = 1;
   mode_C->size = 1;
   mode_C->min = tarval_from_long (mode_L, 0x00000000);
   mode_C->max = tarval_from_long (mode_L, 0x000000ff);
@@ -123,8 +151,8 @@ init_mode (void)
   mode_h->name = id_from_str ("h", 1);
   mode_h->fsigned = 1;
   mode_h->ffloat = 0;
-  mode_h->ld_align = 1;
-  mode_h->size = 4;
+  mode_h->ld_align = 2;
+  mode_h->size = 2;
   mode_h->min = tarval_from_long (mode_l, 0xffff8000);
   mode_h->max = tarval_from_long (mode_l, 0x00007fff);
   mode_h->null = tarval_from_long (mode_h, 0);
@@ -133,8 +161,8 @@ init_mode (void)
   mode_H->name = id_from_str ("H", 1);
   mode_H->fsigned = 0;
   mode_H->ffloat = 0;
-  mode_H->ld_align = 1;
-  mode_H->size = 4;
+  mode_H->ld_align = 2;
+  mode_H->size = 2;
   mode_H->min = tarval_from_long (mode_L, 0x00000000);
   mode_H->max = tarval_from_long (mode_L, 0x0000ffff);
   mode_H->null = tarval_from_long (mode_H, 0);
@@ -143,7 +171,7 @@ init_mode (void)
   mode_i->name = id_from_str ("i", 1);
   mode_i->fsigned = 1;
   mode_i->ffloat = 0;
-  mode_i->ld_align = 2;
+  mode_i->ld_align = 4;
   mode_i->size = 4;
   mode_i->min = tarval_from_long (mode_l, 0x80000000);
   mode_i->max = tarval_from_long (mode_l, 0x7fffffff);
@@ -153,7 +181,7 @@ init_mode (void)
   mode_I->name = id_from_str ("I", 1);
   mode_I->fsigned = 0;
   mode_I->ffloat = 0;
-  mode_I->ld_align = 2;
+  mode_I->ld_align = 4;
   mode_I->size = 4;
   mode_I->min = tarval_from_long (mode_L, 0x00000000);
   mode_I->max = tarval_from_long (mode_L, 0xffffffff);
@@ -163,7 +191,7 @@ init_mode (void)
   mode_l->name = id_from_str ("l", 1);
   mode_l->fsigned = 1;
   mode_l->ffloat = 0;
-  mode_l->ld_align = 2;
+  mode_l->ld_align = 4;
   mode_l->size = 4;
   mode_l->min = tarval_from_long (mode_l, 0x80000000);
   mode_l->max = tarval_from_long (mode_l, 0x7fffffff);
@@ -173,7 +201,7 @@ init_mode (void)
   mode_L->name = id_from_str ("L", 1);
   mode_L->fsigned = 0;
   mode_L->ffloat = 0;
-  mode_L->ld_align = 2;
+  mode_L->ld_align = 4;
   mode_L->size = 4;
   mode_L->min = tarval_from_long (mode_L, 0x00000000);
   mode_L->max = tarval_from_long (mode_L, 0xffffffff);
@@ -193,7 +221,7 @@ init_mode (void)
   mode_p->name = id_from_str ("p", 1);
   mode_p->fsigned = 0;
   mode_p->ffloat = 0;
-  mode_p->ld_align = 2;
+  mode_p->ld_align = 4;
   mode_p->size = 4;
   mode_p->min = tarval_from_long (mode_L, 0x00000000);
   mode_p->max = tarval_from_long (mode_L, 0xffffffff);
@@ -235,7 +263,7 @@ get_mode_modecode (ir_mode *mode)
 }
 
 /*
-inline void
+INLINE void
 set_mode_modecode (ir_mode *mode, modecode code)
 {
   mode->code = code;
@@ -249,14 +277,14 @@ get_mode_ident (ir_mode *mode)
 }
 
 /*
-inline void
+INLINE void
 set_mode_ident (ir_mode *mode, ident *name)
 {
   mode->name = name;
 }
 */
 
-inline const char *
+INLINE const char *
 get_mode_name       (ir_mode *mode) {
   assert(mode);
   return id_to_str(mode->name);
@@ -269,7 +297,7 @@ get_mode_size (ir_mode *mode)
   return mode->size;
 }
 /*
-inline void
+INLINE void
 set_mode_size (ir_mode *mode, int size)
 {
   mode->size = size;
@@ -283,7 +311,7 @@ get_mode_ld_align (ir_mode *mode)
 }
 
 /*
-inline void
+INLINE void
 set_mode_ld_align (ir_mode *mode, int ld_align)
 {
   mode->ld_align = ld_align;
@@ -297,7 +325,7 @@ get_mode_min (ir_mode *mode)
 }
 
 /*
-inline void
+INLINE void
 set_mode_min (ir_mode *mode, tarval *min)
 {
 mode->min = min;
@@ -311,7 +339,7 @@ get_mode_max (ir_mode *mode)
 }
 
 /*
-inline void
+INLINE void
 set_mode_max (ir_mode *mode, tarval *max)
 {
   mode->max = max;
@@ -325,7 +353,7 @@ get_mode_null (ir_mode *mode)
 }
 
 /*
-inline void
+INLINE void
 set_mode_null (ir_mode *mode, tarval *null)
 {
   mode->null = null;
@@ -339,7 +367,7 @@ get_mode_fsigned (ir_mode *mode)
 }
 
 /*
-inline voida
+INLINE voida
 set_mode_fsigned (ir_mode *mode, unsigned fsigned)
 {
   mode->fsigned = fsigned;
@@ -353,7 +381,7 @@ get_mode_ffloat (ir_mode *mode)
 }
 
 /*
-inline void
+INLINE void
 set_mode_ffloat (ir_mode *mode, unsigned ffloat)
 {
   mode->ffloat = ffloat;
@@ -501,3 +529,15 @@ mode_is_dataM (ir_mode *mode)
   }
   return res;
 }
+
+/* Returns true if sm can be converted to lm without loss. */
+bool
+smaller_mode(ir_mode *sm, ir_mode *lm) {
+  if ((mode_is_int(sm) && mode_is_int(lm)) &&
+      get_mode_modecode(sm) <= get_mode_modecode(lm))
+    return true;
+  if ((mode_is_float(sm) && mode_is_float(lm)) &&
+      get_mode_modecode(sm) <= get_mode_modecode(lm))
+    return true;
+  return(false);
+}