X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Ftv%2Ftv.h;h=14cecd52f11c1f59259a4f47552f3de4043ef096;hb=a636a05762cdc49e6b89565a4f6b531dbf49089a;hp=a7fabb60e337d6f7494b9bf074abadf4c24e2a36;hpb=66065b2e2b79a428ccd24f065f099f22fbf6caf2;p=libfirm diff --git a/ir/tv/tv.h b/ir/tv/tv.h index a7fabb60e..14cecd52f 100644 --- a/ir/tv/tv.h +++ b/ir/tv/tv.h @@ -1,23 +1,63 @@ /* Declarations for Target Values. - Copyright (C) 1995, 1996 Christian von Roques */ - -#ifndef _TV_H -#define _TV_H + 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 +> 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. + +*/ + +#ifndef _TV_H_ +#define _TV_H_ # include "irmode.h" # include "entity.h" # include "bool.h" +#ifndef _TARVAL_TYPEDEF_ +#define _TARVAL_TYPEDEF_ typedef struct tarval tarval; +#endif -#include +#include "gmp.h" #undef __need_size_t /* erroneously defined by 1.3.2's gmp.h */ -/* #include "deftab.h" */ /* how to represent target types on host */ -typedef float tarval_f; +typedef float tarval_f; typedef double tarval_d; -typedef long tarval_chil; +typedef long tarval_chil; typedef unsigned long tarval_CHIL; typedef MP_INT tarval_Z; typedef struct { @@ -53,6 +93,7 @@ struct tarval { }; extern tarval *tarval_bad; +/* We should have a tarval_undefined */ extern tarval *tarval_b_false; extern tarval *tarval_b_true; extern tarval *tarval_d_NaN; @@ -68,14 +109,19 @@ void tarval_init_2 (void); /* Hash function on tarvals */ unsigned tarval_hash (tarval *); -/************************* Constructors for tarvals *************************/ +/* ************************ 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_f_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_int_from_str (const char *, size_t, int base, ir_mode *m); tarval *tarval_from_long (ir_mode *, long); + tarval *tarval_p_from_str (const char *); +/* 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 *); tarval *tarval_convert_to (tarval *, ir_mode *); @@ -90,26 +136,26 @@ tarval *tarval_cancel (void); /* returns tarval_bad */ /* 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_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 } ir_pncmp; -/********************* Arithmethic operations on tarvals *********************/ +/* ******************** Arithmethic operations on tarvals ******************** */ /* 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. */ @@ -122,6 +168,7 @@ tarval *tarval_mul (tarval *, tarval *); tarval *tarval_quo (tarval *, tarval *); tarval *tarval_div (tarval *, tarval *); tarval *tarval_mod (tarval *, tarval *); +tarval *tarval_abs (tarval *); tarval *tarval_and (tarval *, tarval *); tarval *tarval_or (tarval *, tarval *); tarval *tarval_eor (tarval *, tarval *); @@ -143,23 +190,15 @@ 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); -bool tv_val_b (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_ */