tv.h 7.53 KB
Newer Older
Christian Schäfer's avatar
Christian Schäfer committed
1
/* Declarations for Target Values.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
2
   Copyright (C) 1995, 1996 Christian von Roques
Boris Boesler's avatar
Boris Boesler committed
3
*/
Götz Lindenmaier's avatar
Götz Lindenmaier committed
4

Michael Beck's avatar
Michael Beck committed
5
6
7
8
9
10
/**
 * @file tv.h
 *
 * Declarations for Target Values.
 */

Boris Boesler's avatar
Boris Boesler committed
11
12
13
/* $Id$ */

/*
Götz Lindenmaier's avatar
Götz Lindenmaier committed
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
>    absolutely essential for an ANSI C translator:  Section 6.1.3.2 of the
>    standard says that the representation of an integer_constant depends
>    upon its value as well as any suffixes that are attached to it.  The
>    possible Firm modes for such a constant are i, I, l, and L.  The
>    current tv module provides only one integer conversion routine, and
>    that requires conversion by the client.  Since the type of the value
>    argument is long, this may preclude the representation of an unsigned
>    long constant.
>
>    There is a similar problem with floating constants.  Floating
>    constants can be suffixed in C, and the mode depends upon the suffix.
>    It can indicate that the constant is of type long double, which your
>    current tv module is incapable of representing.
>
>    Your tv module interface accepts two kinds of information: modes and
>    values.  Values obtained from the program text might be uninterpreted
>    strings, strings interpreted as integers, and strings interpreted as
>    reals.  Values provided by the compiler are usually integers.  Modes are
>    always Firm modes.  It seems to me that the tv module should provide
>    tarval* constructors for three of the four kinds of values.  Each of these
>    constructors should have an ir_mode parameter and one or more parameters
>    appropriate for the kind of value.  As is currently the case, one
>    constructor should be provided for both compiler-generated integers and
>    source strings interpreted as integers.  (This avoids problems of
>    different conversion radices -- the client does the conversion.)  For
>    symmetry, the constructor for source strings interpreted as reals should
>    accept a long double parameter and require the client to do the
>    conversion.

*/
Christian Schäfer's avatar
Christian Schäfer committed
47

48
49
#ifndef _TV_H_
#define _TV_H_
Christian Schäfer's avatar
Christian Schäfer committed
50
51
52

# include "irmode.h"
# include "entity.h"
53
# include <stdbool.h>
Christian Schäfer's avatar
Christian Schäfer committed
54

Götz Lindenmaier's avatar
Götz Lindenmaier committed
55
56
#ifndef _TARVAL_TYPEDEF_
#define _TARVAL_TYPEDEF_
Christian Schäfer's avatar
Christian Schäfer committed
57
typedef struct tarval tarval;
Götz Lindenmaier's avatar
Götz Lindenmaier committed
58
#endif
Christian Schäfer's avatar
Christian Schäfer committed
59

Michael Beck's avatar
Michael Beck committed
60
61
/*@{*/
/** how to represent target types on host */
Matthias Heil's avatar
Matthias Heil committed
62
63
64
65
66
67
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;
68
typedef unsigned short tarval_U;   /* 16 bit ?! wchar could be defined as char...  */
Michael Beck's avatar
Michael Beck committed
69
70
71
/*@}*/

/** tarval_P */
Christian Schäfer's avatar
Christian Schäfer committed
72
typedef struct {
Michael Beck's avatar
Michael Beck committed
73
  /** if ent then xname is missing or mangled from ent,
Christian Schäfer's avatar
Christian Schäfer committed
74
75
76
77
78
79
80
81
     else if xname then xname is a linker symbol that is not mangled
       from an entity,
     else this is tarval_p_void.
     if this tarval describes a symbolic address of another tarval, tv points
     to this val */
  const char *xname;
  entity *ent;
  tarval *tv;
Matthias Heil's avatar
Matthias Heil committed
82
} tarval_P;
Christian Schäfer's avatar
Christian Schäfer committed
83

Michael Beck's avatar
Michael Beck committed
84
/** a trval */
Christian Schäfer's avatar
Christian Schäfer committed
85
86
struct tarval {
  union {
Michael Beck's avatar
Michael Beck committed
87
88
89
90
91
92
93
94
95
    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 */
Christian Schäfer's avatar
Christian Schäfer committed
96
97
98
99
  } u;
  ir_mode *mode;
};

100

101
extern tarval *tarval_bad;                  tarval *get_tarval_bad(void);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
102
/* We should have a tarval_undefined */
103
104
105
106
107
extern tarval *tarval_b_false;              tarval *get_tarval_b_false  (void);
extern tarval *tarval_b_true;               tarval *get_tarval_b_true   (void);
extern tarval *tarval_D_NaN;                tarval *get_tarval_D_NaN    (void);
extern tarval *tarval_D_Inf;                tarval *get_tarval_D_Inf    (void);
extern tarval *tarval_P_void;               tarval *get_tarval_P_void   (void);
108
extern tarval *tarval_mode_null[];          tarval *get_tarval_mode_null(ir_mode *mode);
Michael Beck's avatar
Michael Beck committed
109
110
111

/*@{*/
/** @bug These are not initialized!! Don't use. */
112
113
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);
Michael Beck's avatar
Michael Beck committed
114
/*@}*/
Christian Schäfer's avatar
Christian Schäfer committed
115
116
117
118

void tarval_init_1 (void);
void tarval_init_2 (void);

Michael Beck's avatar
Michael Beck committed
119
120
/*@{*/
/** Constructors for tarvals */
Matthias Heil's avatar
Matthias Heil committed
121
122
tarval *tarval_F_from_str (const char *s, size_t len);
tarval *tarval_D_from_str (const char *s, size_t len);
123
124
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);
Michael Beck's avatar
Michael Beck committed
125
/*@}*/
126

Matthias Heil's avatar
Matthias Heil committed
127
tarval *tarval_P_from_str (const char *xname);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
128
129
/* The tarval represents the address of the entity.  As the address must
   be constant the entity must have as owner the global type. */
Matthias Heil's avatar
Matthias Heil committed
130
tarval *tarval_P_from_entity (entity *ent);
Christian Schäfer's avatar
Christian Schäfer committed
131

132
tarval *tarval_convert_to (tarval *src, ir_mode *m);
Christian Schäfer's avatar
Christian Schäfer committed
133
134
135

/* Building an irm_C, irm_s, irm_S or irm_B target value step by step. */
void tarval_start (void);
136
137
138
void tarval_append (const char *p, size_t n);
void tarval_append1 (char ch);
tarval *tarval_finish_as (ir_mode *m);
Christian Schäfer's avatar
Christian Schäfer committed
139
140
tarval *tarval_cancel (void); /* returns tarval_bad */

Michael Beck's avatar
Michael Beck committed
141
/** The flags for projecting a comparison result */
Christian Schäfer's avatar
Christian Schäfer committed
142
typedef enum {
Michael Beck's avatar
Michael Beck committed
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
  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 */
159
  /*irpn_notmask = irpn_Leg  @@@ removed for JNI builder */
Christian Schäfer's avatar
Christian Schäfer committed
160
} ir_pncmp;
161
#define irpn_notmask irpn_Leg
Christian Schäfer's avatar
Christian Schäfer committed
162

Michael Beck's avatar
Michael Beck committed
163
164
/*@{*/
/** Arithmethic operations on tarvals */
Christian Schäfer's avatar
Christian Schäfer committed
165
tarval *tarval_neg (tarval *a);
166
167
168
169
170
171
172
173
174
175
176
177
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);
Michael Beck's avatar
Michael Beck committed
178
179
180
181
182
183
184
/*@}*/

/** Compare a with b and return an ir_pncmp describing the relation
   between a and b.  This is either Uo, Lt, Eq, Gt, or False if a or b
   are symbolic pointers which can not be compared at all. */
ir_pncmp tarval_comp (tarval *a, tarval *b);

Christian Schäfer's avatar
Christian Schäfer committed
185
186

/* Identifying some tarvals */
187
188
long tarval_classify (tarval *tv);
long tarval_ord (tarval *tv, int *fail);
Christian Schäfer's avatar
Christian Schäfer committed
189

Michael Beck's avatar
Michael Beck committed
190
191
/*@{*/
/** return a mode-specific value */
Matthias Heil's avatar
Matthias Heil committed
192
193
194
195
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);
196
197
198
199
200
/* @@@ 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);
Sebastian Hack's avatar
Sebastian Hack committed
201
*/
Götz Lindenmaier's avatar
Götz Lindenmaier committed
202
bool     tv_val_b (tarval *tv);
Michael Beck's avatar
Michael Beck committed
203
/*@}*/
Christian Schäfer's avatar
Christian Schäfer committed
204
205

ir_mode *get_tv_mode (tarval *tv);
Michael Beck's avatar
Michael Beck committed
206
/** Returns the entity if the tv is a pointer to an entity, else
Götz Lindenmaier's avatar
Götz Lindenmaier committed
207
   returns NULL; */
Florian Liekweg's avatar
Florian Liekweg committed
208
entity *get_tv_entity(tarval *tv);
Christian Schäfer's avatar
Christian Schäfer committed
209

Michael Beck's avatar
Michael Beck committed
210
/** Returns 0 if tv is positive, else > 0. @todo not tested! */
211
int tv_is_negative(tarval *a);
212
#endif  /* _TV_H_ */