**
*/
+/* $Id$ */
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
# include "irmode_t.h"
# include <malloc.h>
# include <stddef.h>
+# include <string.h>
# include "tv.h"
ir_mode *mode_T;
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)
{
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);
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);
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);
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);
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);
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);
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);
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);
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);
}
/*
-inline void
+INLINE void
set_mode_modecode (ir_mode *mode, modecode code)
{
mode->code = code;
}
/*
-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);
return mode->size;
}
/*
-inline void
+INLINE void
set_mode_size (ir_mode *mode, int size)
{
mode->size = size;
}
/*
-inline void
+INLINE void
set_mode_ld_align (ir_mode *mode, int ld_align)
{
mode->ld_align = ld_align;
}
/*
-inline void
+INLINE void
set_mode_min (ir_mode *mode, tarval *min)
{
mode->min = min;
}
/*
-inline void
+INLINE void
set_mode_max (ir_mode *mode, tarval *max)
{
mode->max = max;
}
/*
-inline void
+INLINE void
set_mode_null (ir_mode *mode, tarval *null)
{
mode->null = null;
}
/*
-inline voida
+INLINE voida
set_mode_fsigned (ir_mode *mode, unsigned fsigned)
{
mode->fsigned = fsigned;
}
/*
-inline void
+INLINE void
set_mode_ffloat (ir_mode *mode, unsigned ffloat)
{
mode->ffloat = ffloat;
}
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);
+}