irn_vrfy_irg () added that allows to specify tho IR graph
[libfirm] / ir / ir / irmode.c
index 54e8917..844e38c 100644 (file)
@@ -1,8 +1,8 @@
 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Authors: Martin Trapp, Christian Schaefer
-**
+* All rights reserved.
+*
+* Authors: Martin Trapp,   Christian Schaefer
+*
 */
 
 /* $Id$ */
@@ -12,7 +12,7 @@
 #endif
 
 # include "irmode_t.h"
-# include <malloc.h>
+# include <stdlib.h>
 # include <stddef.h>
 # include <string.h>
 # include "tv.h"
@@ -30,6 +30,7 @@ ir_mode *mode_Iu;
 ir_mode *mode_Ls;
 ir_mode *mode_Lu;
 ir_mode *mode_C;
+ir_mode *mode_U;
 ir_mode *mode_b;
 ir_mode *mode_P;
 ir_mode *mode_X;
@@ -49,6 +50,7 @@ INLINE ir_mode *get_modeIu() { return mode_Iu; }
 INLINE ir_mode *get_modeLs() { return mode_Ls; }
 INLINE ir_mode *get_modeLu() { return mode_Lu; }
 INLINE ir_mode *get_modeC() { return mode_C; }
+INLINE ir_mode *get_modeU() { return mode_U; }
 INLINE ir_mode *get_modeb() { return mode_b; }
 INLINE ir_mode *get_modeP() { return mode_P; }
 INLINE ir_mode *get_modeX() { return mode_X; }
@@ -74,6 +76,7 @@ init_mode (void)
   mode_Ls = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Ls, 0, sizeof(ir_mode));
   mode_Lu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Lu, 0, sizeof(ir_mode));
   mode_C  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_C, 0, sizeof(ir_mode));
+  mode_U  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_U, 0, sizeof(ir_mode));
   mode_b  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_b, 0, sizeof(ir_mode));
   mode_P  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_P, 0, sizeof(ir_mode));
   mode_X  = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_X, 0, sizeof(ir_mode));
@@ -93,6 +96,7 @@ init_mode (void)
   mode_Ls->code = irm_Ls;
   mode_Lu->code = irm_Lu;
   mode_C->code = irm_C;
+  mode_U->code = irm_U;
   mode_b->code = irm_b;
   mode_P->code = irm_P;
   mode_X->code = irm_X;
@@ -216,6 +220,16 @@ init_mode (void)
   mode_C->max = tarval_from_long (mode_Ls, 0x0000007f);
   mode_C->null = tarval_from_long (mode_C, 0);
 
+  /* unicode character */
+  mode_U->name = id_from_str ("U", 1);
+  mode_U->fsigned = 0;
+  mode_U->ffloat = 0;
+  mode_U->ld_align = 1;
+  mode_U->size = 2;
+  mode_U->min = tarval_from_long (mode_Ls, 0xffff8000);
+  mode_U->max = tarval_from_long (mode_Ls, 0x00007fff);
+  mode_U->null = tarval_from_long (mode_U, 0);
+
   /* boolean */
   mode_b->name = id_from_str ("b", 1);
   mode_b->fsigned = 0;
@@ -251,6 +265,7 @@ init_mode (void)
 modecode
 get_mode_modecode (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->code;
 }
 
@@ -265,6 +280,7 @@ set_mode_modecode (ir_mode *mode, modecode code)
 ident *
 get_mode_ident (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->name;
 }
 
@@ -286,6 +302,7 @@ get_mode_name       (ir_mode *mode) {
 int
 get_mode_size (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->size;
 }
 /*
@@ -299,6 +316,7 @@ set_mode_size (ir_mode *mode, int size)
 int
 get_mode_ld_align (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->ld_align;
 }
 
@@ -313,6 +331,7 @@ set_mode_ld_align (ir_mode *mode, int ld_align)
 tarval *
 get_mode_min (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->min;
 }
 
@@ -327,6 +346,7 @@ mode->min = min;
 tarval *
 get_mode_max (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->max;
 }
 
@@ -341,6 +361,7 @@ set_mode_max (ir_mode *mode, tarval *max)
 tarval *
 get_mode_null (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->null;
 }
 
@@ -355,6 +376,7 @@ set_mode_null (ir_mode *mode, tarval *null)
 unsigned
 get_mode_fsigned (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->fsigned;
 }
 
@@ -369,6 +391,7 @@ set_mode_fsigned (ir_mode *mode, unsigned fsigned)
 unsigned
 get_mode_ffloat (ir_mode *mode)
 {
+  assert(mode && "no mode given");
   return mode->ffloat;
 }
 
@@ -401,73 +424,81 @@ set_mode_ffloat (ir_mode *mode, unsigned ffloat)
    The set of "data" is defined as:
    -------------------------------
    data  = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
-            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_p}
+            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_p}
             = {num || irm_C || irm_P}
 
    The set of "datab" is defined as:
    ---------------------------------
    datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
-            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_P, irm_b}
+            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
             = {data || irm_b }
 
    The set of "dataM" is defined as:
    ---------------------------------
    dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
-            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_P, irm_M}
+            irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
             = {data || irm_M}
 */
 
 int
 mode_is_signed (ir_mode *mode)
 {
-   int res;
-   unsigned fsigned;
-   fsigned = get_mode_fsigned (mode);
-   if (fsigned == 1) {
-     res = 1;
-    }
-   else {
-     res = 0;
-   }
-   return res;
+  int res;
+  unsigned fsigned;
+
+  assert(mode && "no mode given");
+  fsigned = get_mode_fsigned (mode);
+  if (fsigned == 1) {
+    res = 1;
+  }
+  else {
+    res = 0;
+  }
+  return res;
 }
 
-int
+INLINE int
 mode_is_float (ir_mode *mode)
 {
-   int res;
-   unsigned ffloat;
-   ffloat = get_mode_ffloat (mode);
-   if (ffloat == 1) {
-      res = 1;
-    }
-   else {
-     res = 0;
-   }
-   return res;
+  int res;
+  unsigned ffloat;
+
+  assert(mode && "no mode given");
+  ffloat = get_mode_ffloat (mode);
+  if (ffloat == 1) {
+    res = 1;
+  }
+  else {
+    res = 0;
+  }
+  return res;
 }
 
 
-int
+INLINE int
 mode_is_int (ir_mode *mode)
 {
-   int res;
-   modecode code;
-   code = get_mode_modecode (mode);
-   if ((code >= irm_Bs) &&  (code <= irm_Lu)) {
-      res = 1;
-    }
-   else {
-     res = 0;
-   }
-   return res;
+  int res;
+  modecode code;
+
+  assert(mode && "no mode given");
+  code = get_mode_modecode (mode);
+  if ((code >= irm_Bs) &&  (code <= irm_Lu)) {
+    res = 1;
+  }
+  else {
+    res = 0;
+  }
+  return res;
 }
 
 
-int
+INLINE int
 mode_is_num (ir_mode *mode)
 {
   int res;
+
+  assert(mode && "no mode given");
   if (mode_is_int (mode) || mode_is_float (mode)) {
     res = 1;
   }
@@ -477,13 +508,16 @@ mode_is_num (ir_mode *mode)
   return res;
 }
 
-int
+INLINE int
 mode_is_data (ir_mode *mode)
 {
   int res;
   modecode code;
+
+  assert(mode && "no mode given");
   code = get_mode_modecode (mode);
-  if (mode_is_num (mode) || code == irm_C || code == irm_P) {
+  if (mode_is_num (mode) ||
+      code == irm_C || code == irm_U || code == irm_P) {
     res = 1;
   }
   else {
@@ -497,6 +531,8 @@ mode_is_datab (ir_mode *mode)
 {
   int res;
   modecode code;
+
+  assert(mode && "no mode given");
   code = get_mode_modecode (mode);
   if (mode_is_data (mode) || code == irm_b ) {
     res = 1;
@@ -512,6 +548,8 @@ mode_is_dataM (ir_mode *mode)
 {
   int res;
   modecode code;
+
+  assert(mode && "no mode given");
   code = get_mode_modecode (mode);
   if (mode_is_data (mode) || code == irm_M) {
     res = 1;