0ae4c03948d8da1051e680d9a9ca7f65ad7796fb
[libfirm] / ir / tv / tv.h
1 /* Declarations for Target Values.
2    Copyright (C) 1995, 1996 Christian von Roques */
3
4 #ifndef _TV_H
5 #define _TV_H
6
7 # include "irmode.h"
8 # include "entity.h"
9 # include "bool.h"
10
11 #ifndef _TARVAL_TYPEDEF_
12 #define _TARVAL_TYPEDEF_
13 typedef struct tarval tarval;
14 #endif
15
16 /* #include <gmp.h> Eli can't find gmp.h if it's available in a local
17    search path but not in a standard one known to gcc. */
18 #include "gmp.h"
19 #undef __need_size_t            /* erroneously defined by 1.3.2's gmp.h */
20 /* #include "deftab.h" */
21
22 /* how to represent target types on host */
23 typedef float  tarval_f;
24 typedef double tarval_d;
25 typedef long   tarval_chil;
26 typedef unsigned long tarval_CHIL;
27 typedef MP_INT tarval_Z;
28 typedef struct {
29   /* if ent then xname is missing or mangled from ent,
30      else if xname then xname is a linker symbol that is not mangled
31        from an entity,
32      else this is tarval_p_void.
33      if this tarval describes a symbolic address of another tarval, tv points
34      to this val */
35   const char *xname;
36   entity *ent;
37   tarval *tv;
38 } tarval_p;
39 typedef struct {
40   unsigned char *p;             /* may contain embedded 0, not 0-terminated */
41   size_t n;
42 } tarval_s;
43 typedef tarval_s tarval_B;
44
45 struct tarval {
46   union {
47     tarval_f f;                 /* float */
48     tarval_d d;                 /* double */
49     tarval_chil chil;           /* signed integral */
50     tarval_CHIL CHIL;           /* unsigned integral */
51     tarval_Z Z;                 /* universal int */
52     tarval_p p;                 /* pointer */
53     bool b;                     /* boolean */
54     tarval_B B;                 /* universal bits */
55     tarval_s s;                 /* string */
56   } u;
57   ir_mode *mode;
58 };
59
60 extern tarval *tarval_bad;
61 extern tarval *tarval_b_false;
62 extern tarval *tarval_b_true;
63 extern tarval *tarval_d_NaN;
64 extern tarval *tarval_d_Inf;
65 extern tarval *tarval_p_void;
66 extern tarval *tarval_mode_null[];
67 extern tarval *tarval_mode_min[];
68 extern tarval *tarval_mode_max[];
69
70 void tarval_init_1 (void);
71 void tarval_init_2 (void);
72
73 /* Hash function on tarvals */
74 unsigned tarval_hash (tarval *);
75
76 /************************* Constructors for tarvals *************************/
77 tarval *tarval_Z_from_str (const char *, size_t, int base);
78 tarval *tarval_B_from_str (const char *, size_t);
79 tarval *tarval_d_from_str (const char *, size_t);
80 tarval *tarval_s_from_str (const char *, size_t);
81 tarval *tarval_S_from_str (const char *, size_t);
82 tarval *tarval_from_long  (ir_mode *, long);
83 tarval *tarval_p_from_str (const char *);
84 tarval *tarval_p_from_entity (entity *);
85
86 tarval *tarval_convert_to (tarval *, ir_mode *);
87
88 /* Building an irm_C, irm_s, irm_S or irm_B target value step by step. */
89 void tarval_start (void);
90 void tarval_append (const char *, size_t);
91 void tarval_append1 (char);
92 tarval *tarval_finish_as (ir_mode *);
93 tarval *tarval_cancel (void); /* returns tarval_bad */
94
95 \f
96 /* The flags for projecting a comparison result */
97 typedef enum {
98   irpn_False=0,         /* false */
99   irpn_Eq,              /* equal */
100   irpn_Lt,              /* less */
101   irpn_Le,              /* less or equal */
102   irpn_Gt,              /* greater */
103   irpn_Ge,              /* greater of equal */
104   irpn_Lg,              /* less or greater */
105   irpn_Leg,             /* less, equal or greater = ordered */
106   irpn_Uo,              /* unordered */
107   irpn_Ue,              /* unordered or equal */
108   irpn_Ul,              /* unordered or less */
109   irpn_Ule,             /* unordered, less or equal */
110   irpn_Ug,              /* unordered or greater */
111   irpn_Uge,             /* unordered, greater or equal */
112   irpn_Ne,              /* unordered, less or greater = not equal */
113   irpn_True,            /* true */
114   irpn_notmask = irpn_Leg
115 } ir_pncmp;
116
117 /********************* Arithmethic operations on tarvals *********************/
118 /* Compare a with b and return an ir_pncmp describing the relation
119    between a and b.  This is either Uo, Lt, Eq, Gt, or False if a or b
120    are symbolic pointers which can not be compared at all. */
121 ir_pncmp tarval_comp (tarval *a, tarval *b);
122
123 tarval *tarval_neg (tarval *a);
124 tarval *tarval_add (tarval *, tarval *);
125 tarval *tarval_sub (tarval *, tarval *);
126 tarval *tarval_mul (tarval *, tarval *);
127 tarval *tarval_quo (tarval *, tarval *);
128 tarval *tarval_div (tarval *, tarval *);
129 tarval *tarval_mod (tarval *, tarval *);
130 tarval *tarval_and (tarval *, tarval *);
131 tarval *tarval_or  (tarval *, tarval *);
132 tarval *tarval_eor (tarval *, tarval *);
133 tarval *tarval_shl (tarval *, tarval *);
134 tarval *tarval_shr (tarval *, tarval *);
135
136 /* Identifying some tarvals */
137 long tarval_classify (tarval *);
138 long tarval_ord (tarval *, int *fail);
139
140 /* moved to tv_t.h
141    int tarval_print (XP_PAR1, const xprintf_info *, XP_PARN); */
142
143 /* return a mode-specific value */
144
145 tarval_f tv_val_f (tarval *tv);
146 tarval_d tv_val_d (tarval *tv);
147 tarval_chil tv_val_chil (tarval *tv);
148 tarval_CHIL tv_val_CHIL (tarval *tv);
149 tarval_Z tv_val_Z (tarval *tv);
150 tarval_p tv_val_p (tarval *tv);
151 bool     tv_val_b (tarval *tv);
152 tarval_B tv_val_B (tarval *tv);
153 tarval_s tv_val_s (tarval *tv);
154
155 #ifdef NDEBUG
156 #define TARVAL_VRFY(val) ((void)0)
157 #else
158 #define TARVAL_VRFY(val) _tarval_vrfy ((val))
159 extern void _tarval_vrfy (const tarval *);
160 #endif
161
162 #ifdef STATS
163 void tarval_stats (void);
164 #else
165 #define tarval_stats() ((void)0)
166 #endif
167
168 ir_mode *get_tv_mode (tarval *tv);
169
170 #endif