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