normalized various syntactic constructs for firm jni.
[libfirm] / ir / tv / tv.h
1 /* Declarations for Target Values.
2    Copyright (C) 1995, 1996 Christian von Roques
3 */
4
5 /* $Id$ */
6
7 /*
8 Discussion of new interface, proposals by Prof. Waite:
9 (email of 13.6.2001)
10 > 1. You say that you plan to replace the tv module.  That replacement is
11 >    absolutely essential for an ANSI C translator:  Section 6.1.3.2 of the
12 >    standard says that the representation of an integer_constant depends
13 >    upon its value as well as any suffixes that are attached to it.  The
14 >    possible Firm modes for such a constant are i, I, l, and L.  The
15 >    current tv module provides only one integer conversion routine, and
16 >    that requires conversion by the client.  Since the type of the value
17 >    argument is long, this may preclude the representation of an unsigned
18 >    long constant.
19 >
20 >    There is a similar problem with floating constants.  Floating
21 >    constants can be suffixed in C, and the mode depends upon the suffix.
22 >    It can indicate that the constant is of type long double, which your
23 >    current tv module is incapable of representing.
24 >
25 >    Your tv module interface accepts two kinds of information: modes and
26 >    values.  Values obtained from the program text might be uninterpreted
27 >    strings, strings interpreted as integers, and strings interpreted as
28 >    reals.  Values provided by the compiler are usually integers.  Modes are
29 >    always Firm modes.  It seems to me that the tv module should provide
30 >    tarval* constructors for three of the four kinds of values.  Each of these
31 >    constructors should have an ir_mode parameter and one or more parameters
32 >    appropriate for the kind of value.  As is currently the case, one
33 >    constructor should be provided for both compiler-generated integers and
34 >    source strings interpreted as integers.  (This avoids problems of
35 >    different conversion radices -- the client does the conversion.)  For
36 >    symmetry, the constructor for source strings interpreted as reals should
37 >    accept a long double parameter and require the client to do the
38 >    conversion.
39
40 */
41
42 #ifndef _TV_H_
43 #define _TV_H_
44
45 # include "irmode.h"
46 # include "entity.h"
47 # include "bool.h"
48
49 #ifndef _TARVAL_TYPEDEF_
50 #define _TARVAL_TYPEDEF_
51 typedef struct tarval tarval;
52 #endif
53
54 /* how to represent target types on host */
55 typedef float  tarval_f;
56 typedef double tarval_d;
57 typedef long   tarval_chil;
58 typedef unsigned long tarval_CHIL;
59 typedef int tarval_Z;   /* Do not use!!! */
60 typedef struct {
61   /* if ent then xname is missing or mangled from ent,
62      else if xname then xname is a linker symbol that is not mangled
63        from an entity,
64      else this is tarval_p_void.
65      if this tarval describes a symbolic address of another tarval, tv points
66      to this val */
67   const char *xname;
68   entity *ent;
69   tarval *tv;
70 } tarval_p;
71 typedef struct {
72   unsigned char *p;             /* may contain embedded 0, not 0-terminated */
73   size_t n;
74 } tarval_s;
75 typedef tarval_s tarval_B;
76
77 struct tarval {
78   union {
79     tarval_f f;                 /* float */
80     tarval_d d;                 /* double */
81     tarval_chil chil;           /* signed integral */
82     tarval_CHIL CHIL;           /* unsigned integral */
83     tarval_Z Z;                 /* @@@ Do not use!!! universal int */
84     tarval_p p;                 /* pointer */
85     bool b;                     /* boolean */
86     tarval_B B;                 /* universal bits */
87     tarval_s s;                 /* string */
88   } u;
89   ir_mode *mode;
90 };
91
92
93 extern tarval *tarval_bad;                  tarval *get_tarval_bad();
94 /* We should have a tarval_undefined */
95 extern tarval *tarval_b_false;              tarval *get_tarval_b_false  ();
96 extern tarval *tarval_b_true;               tarval *get_tarval_b_true   ();
97 extern tarval *tarval_d_NaN;                tarval *get_tarval_d_NaN    ();
98 extern tarval *tarval_d_Inf;                tarval *get_tarval_d_Inf    ();
99 extern tarval *tarval_p_void;               tarval *get_tarval_p_void   ();
100 extern tarval *tarval_mode_null[];          tarval *get_tarval_mode_null(ir_mode *mode);
101 /* @@@ These are not initialized!! Don't use. */
102 extern tarval *tarval_mode_min[];           tarval *get_tarval_mode_min (ir_mode *mode);
103 extern tarval *tarval_mode_max[];           tarval *get_tarval_mode_max (ir_mode *mode);
104
105 void tarval_init_1 (void);
106 void tarval_init_2 (void);
107
108 /* ************************ Constructors for tarvals ************************ */
109 /*tarval *tarval_Z_from_str (const char *s, size_t len, int base);*/
110 tarval *tarval_f_from_str (const char *s, size_t len);
111 tarval *tarval_d_from_str (const char *s, size_t len);
112 tarval *tarval_int_from_str (const char *s, size_t len, int base, ir_mode *m);
113 tarval *tarval_from_long  (ir_mode *m, long val);
114
115 tarval *tarval_p_from_str (const char *xname);
116 /* The tarval represents the address of the entity.  As the address must
117    be constant the entity must have as owner the global type. */
118 tarval *tarval_p_from_entity (entity *ent);
119
120 tarval *tarval_convert_to (tarval *src, ir_mode *m);
121
122 /* Building an irm_C, irm_s, irm_S or irm_B target value step by step. */
123 void tarval_start (void);
124 void tarval_append (const char *p, size_t n);
125 void tarval_append1 (char ch);
126 tarval *tarval_finish_as (ir_mode *m);
127 tarval *tarval_cancel (void); /* returns tarval_bad */
128
129 /* The flags for projecting a comparison result */
130 typedef enum {
131   irpn_False=0,         /* 0000 false */
132   irpn_Eq,              /* 0001 equal */
133   irpn_Lt,              /* 0010 less */
134   irpn_Le,              /* 0011 less or equal */
135   irpn_Gt,              /* 0100 greater */
136   irpn_Ge,              /* 0101 greater of equal */
137   irpn_Lg,              /* 0110 less or greater */
138   irpn_Leg,             /* 0111 less, equal or greater = ordered */
139   irpn_Uo,              /* 1000 unordered */
140   irpn_Ue,              /* 1001 unordered or equal */
141   irpn_Ul,              /* 1010 unordered or less */
142   irpn_Ule,             /* 1011 unordered, less or equal */
143   irpn_Ug,              /* 1100 unordered or greater */
144   irpn_Uge,             /* 1101 unordered, greater or equal */
145   irpn_Ne,              /* 1110 unordered, less or greater = not equal */
146   irpn_True             /* 1111 true */
147   /*irpn_notmask = irpn_Leg  @@@ removed for JNI builder */
148 } ir_pncmp;
149 #define irpn_notmask irpn_Leg
150
151 /* ******************** Arithmethic operations on tarvals ******************** */
152 /* Compare a with b and return an ir_pncmp describing the relation
153    between a and b.  This is either Uo, Lt, Eq, Gt, or False if a or b
154    are symbolic pointers which can not be compared at all. */
155 ir_pncmp tarval_comp (tarval *a, tarval *b);
156
157 tarval *tarval_neg (tarval *a);
158 tarval *tarval_add (tarval *a, tarval *b);
159 tarval *tarval_sub (tarval *a, tarval *b);
160 tarval *tarval_mul (tarval *a, tarval *b);
161 tarval *tarval_quo (tarval *a, tarval *b);
162 tarval *tarval_div (tarval *a, tarval *b);
163 tarval *tarval_mod (tarval *a, tarval *b);
164 tarval *tarval_abs (tarval *a);
165 tarval *tarval_and (tarval *a, tarval *b);
166 tarval *tarval_or  (tarval *a, tarval *b);
167 tarval *tarval_eor (tarval *a, tarval *b);
168 tarval *tarval_shl (tarval *a, tarval *b);
169 tarval *tarval_shr (tarval *a, tarval *b);
170
171 /* Identifying some tarvals */
172 long tarval_classify (tarval *tv);
173 long tarval_ord (tarval *tv, int *fail);
174
175 /* return a mode-specific value */
176 tarval_f tv_val_f (tarval *tv);
177 tarval_d tv_val_d (tarval *tv);
178 tarval_chil tv_val_chil (tarval *tv);
179 tarval_CHIL tv_val_CHIL (tarval *tv);
180 /*tarval_Z tv_val_Z (tarval *tv);*/
181 /* @@@ temporarily removed.
182    jni builder can not deal with the return value.
183    All definitions of types are interpreted as pointer values until
184    type analysis exists for crecoder.
185    tarval_p tv_val_p (tarval *tv);
186 */;
187 bool     tv_val_b (tarval *tv);
188
189 ir_mode *get_tv_mode (tarval *tv);
190 /* Returns the entity if the tv is a pointer to an entity, else
191    returns NULL; */
192 entity *get_tv_entity(tarval *tv);
193
194 /* Returns 0 if tv is positive, else > 0. @@@ not tested! */
195 int tv_is_negative(tarval *a);
196 #endif  /* _TV_H_ */