Added new mode for unicode character.
[libfirm] / ir / tv / tv.h
index a6c719b..a8df0ed 100644 (file)
@@ -1,6 +1,10 @@
 /* Declarations for Target Values.
    Copyright (C) 1995, 1996 Christian von Roques
+*/
+
+/* $Id$ */
 
+/*
 Discussion of new interface, proposals by Prof. Waite:
 (email of 13.6.2001)
 > 1. You say that you plan to replace the tv module.  That replacement is
@@ -35,27 +39,26 @@ Discussion of new interface, proposals by Prof. Waite:
 
 */
 
-#ifndef _TV_H
-#define _TV_H
+#ifndef _TV_H_
+#define _TV_H_
 
 # include "irmode.h"
 # include "entity.h"
-# include "bool.h"
+# include <stdbool.h>
 
 #ifndef _TARVAL_TYPEDEF_
 #define _TARVAL_TYPEDEF_
 typedef struct tarval tarval;
 #endif
 
-#include "gmp.h"
-#undef __need_size_t           /* erroneously defined by 1.3.2's gmp.h */
-
 /* how to represent target types on host */
-typedef float  tarval_f;
-typedef double tarval_d;
-typedef long   tarval_chil;
-typedef unsigned long tarval_CHIL;
-typedef MP_INT tarval_Z;
+typedef float  tarval_F;
+typedef double tarval_D;
+typedef long double tarval_E;
+typedef long   tarval_sInt;
+typedef unsigned long tarval_uInt;
+typedef char tarval_C;
+typedef unsigned short tarval_U;   /* 16 bit ?! wchar could be defined as char...  */
 typedef struct {
   /* if ent then xname is missing or mangled from ent,
      else if xname then xname is a linker symbol that is not mangled
@@ -66,84 +69,80 @@ typedef struct {
   const char *xname;
   entity *ent;
   tarval *tv;
-} tarval_p;
-typedef struct {
-  unsigned char *p;            /* may contain embedded 0, not 0-terminated */
-  size_t n;
-} tarval_s;
-typedef tarval_s tarval_B;
+} tarval_P;
 
 struct tarval {
   union {
-    tarval_f f;                        /* float */
-    tarval_d d;                        /* double */
-    tarval_chil chil;          /* signed integral */
-    tarval_CHIL CHIL;          /* unsigned integral */
-    tarval_Z Z;                 /* universal int */
-    tarval_p p;                        /* pointer */
-    bool b;                    /* boolean */
-    tarval_B B;                        /* universal bits */
-    tarval_s s;                        /* string */
+    tarval_F F;         /* float */
+    tarval_D D;         /* double */
+    tarval_E E;         /* extended */
+    tarval_sInt sInt;   /* signed integral */
+    tarval_uInt uInt;   /* unsigned integral */
+    tarval_C C;         /* character */
+    tarval_U U;         /* unicode character */
+    tarval_P P;         /* pointer */
+    bool b;             /* boolean */
   } u;
   ir_mode *mode;
 };
 
-extern tarval *tarval_bad;
-extern tarval *tarval_b_false;
-extern tarval *tarval_b_true;
-extern tarval *tarval_d_NaN;
-extern tarval *tarval_d_Inf;
-extern tarval *tarval_p_void;
-extern tarval *tarval_mode_null[];
-extern tarval *tarval_mode_min[];
-extern tarval *tarval_mode_max[];
+
+extern tarval *tarval_bad;                  tarval *get_tarval_bad();
+/* We should have a tarval_undefined */
+extern tarval *tarval_b_false;              tarval *get_tarval_b_false  ();
+extern tarval *tarval_b_true;               tarval *get_tarval_b_true   ();
+extern tarval *tarval_D_NaN;                tarval *get_tarval_D_NaN    ();
+extern tarval *tarval_D_Inf;                tarval *get_tarval_D_Inf    ();
+extern tarval *tarval_P_void;               tarval *get_tarval_P_void   ();
+extern tarval *tarval_mode_null[];          tarval *get_tarval_mode_null(ir_mode *mode);
+/* @@@ These are not initialized!! Don't use. */
+extern tarval *tarval_mode_min[];           tarval *get_tarval_mode_min (ir_mode *mode);
+extern tarval *tarval_mode_max[];           tarval *get_tarval_mode_max (ir_mode *mode);
 
 void tarval_init_1 (void);
 void tarval_init_2 (void);
 
-/* Hash function on tarvals */
-unsigned tarval_hash (tarval *);
-
 /* ************************ Constructors for tarvals ************************ */
-tarval *tarval_Z_from_str (const char *, size_t, int base);
-tarval *tarval_B_from_str (const char *, size_t);
-tarval *tarval_d_from_str (const char *, size_t);
-tarval *tarval_s_from_str (const char *, size_t);
-tarval *tarval_S_from_str (const char *, size_t);
-tarval *tarval_from_long  (ir_mode *, long);
-tarval *tarval_p_from_str (const char *);
-tarval *tarval_p_from_entity (entity *);
+tarval *tarval_F_from_str (const char *s, size_t len);
+tarval *tarval_D_from_str (const char *s, size_t len);
+tarval *tarval_int_from_str (const char *s, size_t len, int base, ir_mode *m);
+tarval *tarval_from_long  (ir_mode *m, long val);
+
+tarval *tarval_P_from_str (const char *xname);
+/* The tarval represents the address of the entity.  As the address must
+   be constant the entity must have as owner the global type. */
+tarval *tarval_P_from_entity (entity *ent);
 
-tarval *tarval_convert_to (tarval *, ir_mode *);
+tarval *tarval_convert_to (tarval *src, ir_mode *m);
 
 /* Building an irm_C, irm_s, irm_S or irm_B target value step by step. */
 void tarval_start (void);
-void tarval_append (const char *, size_t);
-void tarval_append1 (char);
-tarval *tarval_finish_as (ir_mode *);
+void tarval_append (const char *p, size_t n);
+void tarval_append1 (char ch);
+tarval *tarval_finish_as (ir_mode *m);
 tarval *tarval_cancel (void); /* returns tarval_bad */
 
-\f
 /* The flags for projecting a comparison result */
 typedef enum {
-  irpn_False=0,                /* false */
-  irpn_Eq,             /* equal */
-  irpn_Lt,             /* less */
-  irpn_Le,             /* less or equal */
-  irpn_Gt,             /* greater */
-  irpn_Ge,             /* greater of equal */
-  irpn_Lg,             /* less or greater */
-  irpn_Leg,            /* less, equal or greater = ordered */
-  irpn_Uo,             /* unordered */
-  irpn_Ue,             /* unordered or equal */
-  irpn_Ul,             /* unordered or less */
-  irpn_Ule,            /* unordered, less or equal */
-  irpn_Ug,             /* unordered or greater */
-  irpn_Uge,            /* unordered, greater or equal */
-  irpn_Ne,             /* unordered, less or greater = not equal */
-  irpn_True,           /* true */
-  irpn_notmask = irpn_Leg
+  irpn_False=0,        /* 0000 false */
+  irpn_Eq,             /* 0001 equal */
+  irpn_Lt,             /* 0010 less */
+  irpn_Le,             /* 0011 less or equal */
+  irpn_Gt,             /* 0100 greater */
+  irpn_Ge,             /* 0101 greater of equal */
+  irpn_Lg,             /* 0110 less or greater */
+  irpn_Leg,            /* 0111 less, equal or greater = ordered */
+  irpn_Uo,             /* 1000 unordered */
+  irpn_Ue,             /* 1001 unordered or equal */
+  irpn_Ul,             /* 1010 unordered or less */
+  irpn_Ule,            /* 1011 unordered, less or equal */
+  irpn_Ug,             /* 1100 unordered or greater */
+  irpn_Uge,            /* 1101 unordered, greater or equal */
+  irpn_Ne,             /* 1110 unordered, less or greater = not equal */
+  irpn_True            /* 1111 true */
+  /*irpn_notmask = irpn_Leg  @@@ removed for JNI builder */
 } ir_pncmp;
+#define irpn_notmask irpn_Leg
 
 /* ******************** Arithmethic operations on tarvals ******************** */
 /* Compare a with b and return an ir_pncmp describing the relation
@@ -152,50 +151,41 @@ typedef enum {
 ir_pncmp tarval_comp (tarval *a, tarval *b);
 
 tarval *tarval_neg (tarval *a);
-tarval *tarval_add (tarval *, tarval *);
-tarval *tarval_sub (tarval *, tarval *);
-tarval *tarval_mul (tarval *, tarval *);
-tarval *tarval_quo (tarval *, tarval *);
-tarval *tarval_div (tarval *, tarval *);
-tarval *tarval_mod (tarval *, tarval *);
-tarval *tarval_and (tarval *, tarval *);
-tarval *tarval_or  (tarval *, tarval *);
-tarval *tarval_eor (tarval *, tarval *);
-tarval *tarval_shl (tarval *, tarval *);
-tarval *tarval_shr (tarval *, tarval *);
+tarval *tarval_add (tarval *a, tarval *b);
+tarval *tarval_sub (tarval *a, tarval *b);
+tarval *tarval_mul (tarval *a, tarval *b);
+tarval *tarval_quo (tarval *a, tarval *b);
+tarval *tarval_div (tarval *a, tarval *b);
+tarval *tarval_mod (tarval *a, tarval *b);
+tarval *tarval_abs (tarval *a);
+tarval *tarval_and (tarval *a, tarval *b);
+tarval *tarval_or  (tarval *a, tarval *b);
+tarval *tarval_eor (tarval *a, tarval *b);
+tarval *tarval_shl (tarval *a, tarval *b);
+tarval *tarval_shr (tarval *a, tarval *b);
 
 /* Identifying some tarvals */
-long tarval_classify (tarval *);
-long tarval_ord (tarval *, int *fail);
-
-/* moved to tv_t.h
-   int tarval_print (XP_PAR1, const xprintf_info *, XP_PARN); */
+long tarval_classify (tarval *tv);
+long tarval_ord (tarval *tv, int *fail);
 
 /* return a mode-specific value */
-
-tarval_f tv_val_f (tarval *tv);
-tarval_d tv_val_d (tarval *tv);
-tarval_chil tv_val_chil (tarval *tv);
-tarval_CHIL tv_val_CHIL (tarval *tv);
-tarval_Z tv_val_Z (tarval *tv);
-tarval_p tv_val_p (tarval *tv);
+tarval_F tv_val_F (tarval *tv);
+tarval_D tv_val_D (tarval *tv);
+tarval_sInt tv_val_sInt (tarval *tv);
+tarval_uInt tv_val_uInt (tarval *tv);
+/* @@@ temporarily removed.
+   jni builder can not deal with the return value.
+   All definitions of types are interpreted as pointer values until
+   type analysis exists for crecoder.
+   tarval_p tv_val_p (tarval *tv);
+*/;
 bool     tv_val_b (tarval *tv);
-tarval_B tv_val_B (tarval *tv);
-tarval_s tv_val_s (tarval *tv);
-
-#ifdef NDEBUG
-#define TARVAL_VRFY(val) ((void)0)
-#else
-#define TARVAL_VRFY(val) _tarval_vrfy ((val))
-extern void _tarval_vrfy (const tarval *);
-#endif
-
-#ifdef STATS
-void tarval_stats (void);
-#else
-#define tarval_stats() ((void)0)
-#endif
 
 ir_mode *get_tv_mode (tarval *tv);
+/* Returns the entity if the tv is a pointer to an entity, else
+   returns NULL; */
+entity *get_tv_entity(tarval *tv);
 
-#endif
+/* Returns 0 if tv is positive, else > 0. @@@ not tested! */
+int tv_is_negative(tarval *a);
+#endif  /* _TV_H_ */