From: Michael Beck Date: Sat, 26 Jul 2008 05:35:52 +0000 (+0000) Subject: - add tarval_is_constant() to check whether a tarval represents a constant or an... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=f43025532c25319fff5d01e8fa18592d4e9c7c68;p=libfirm - add tarval_is_constant() to check whether a tarval represents a constant or an reserved value - add explicit mode_X tarval_unreachable and tarval_reachable tarvals needed for combo - fixed a doxygen comment [r20702] --- diff --git a/include/libfirm/tv.h b/include/libfirm/tv.h index 70f96543a..870dc066e 100644 --- a/include/libfirm/tv.h +++ b/include/libfirm/tv.h @@ -267,11 +267,17 @@ int tarval_is_one(tarval *tv); */ int tarval_is_minus_one(tarval *tv); -/* +/** * returns non-zero if all bits in the tarval are set */ int tarval_is_all_one(tarval *tv); +/** + * Return non-zero if the tarval is a constant (ie. NOT + * a reserved tarval like bad, undef, reachable etc.) + */ +int tarval_is_constant(tarval *tv); + /** The 'bad' tarval. */ extern tarval *tarval_bad; /** Returns the 'bad' tarval. */ @@ -284,7 +290,6 @@ tarval *get_tarval_undefined(void); /** The mode_b tarval 'false'. */ extern tarval *tarval_b_false; - /** Returns the mode_b tarval 'false'. */ tarval *get_tarval_b_false(void); @@ -293,6 +298,16 @@ extern tarval *tarval_b_true; /** Returns the mode_b tarval 'true'. */ tarval *get_tarval_b_true(void); +/** The mode_X tarval 'unreachable'. */ +extern tarval *tarval_unreachable; +/** Returns the mode_X tarval 'unreachable'. */ +tarval *get_tarval_unreachable(void); + +/** The mode_X tarval 'reachable'. */ +extern tarval *tarval_reachable; +/** Returns the mode_X tarval 'reachable'. */ +tarval *get_tarval_reachable(void); + /** The 'top' tarval. This is just another name for the 'undefined' tarval. */ #define tarval_top tarval_undefined /** Returns the 'top' tarval. */ diff --git a/ir/tv/tv.c b/ir/tv/tv.c index 127ce68c7..ef1ea63b9 100644 --- a/ir/tv/tv.c +++ b/ir/tv/tv.c @@ -279,12 +279,14 @@ static tarval *get_tarval_overflow(const void *value, int length, ir_mode *mode) /* * public variables declared in tv.h */ -static tarval reserved_tv[4]; +static tarval reserved_tv[6]; -tarval *tarval_bad = &reserved_tv[0]; -tarval *tarval_undefined = &reserved_tv[1]; -tarval *tarval_b_false = &reserved_tv[2]; -tarval *tarval_b_true = &reserved_tv[3]; +tarval *tarval_bad = &reserved_tv[0]; +tarval *tarval_undefined = &reserved_tv[1]; +tarval *tarval_b_false = &reserved_tv[2]; +tarval *tarval_b_true = &reserved_tv[3]; +tarval *tarval_reachable = &reserved_tv[4]; +tarval *tarval_unreachable = &reserved_tv[5]; /* * public functions declared in tv.h @@ -308,8 +310,10 @@ tarval *new_tarval_from_str(const char *str, size_t len, ir_mode *mode) case irms_internal_boolean: /* match [tT][rR][uU][eE]|[fF][aA][lL][sS][eE] */ - if (strcasecmp(str, "true")) return tarval_b_true; - else if (strcasecmp(str, "false")) return tarval_b_true; + if (strcasecmp(str, "true")) + return tarval_b_true; + else if (strcasecmp(str, "false")) + return tarval_b_true; else /* XXX This is C semantics */ return atoi(str) ? tarval_b_true : tarval_b_false; @@ -460,6 +464,14 @@ tarval *(get_tarval_b_true)(void) { return _get_tarval_b_true(); } +tarval *(get_tarval_reachable)(void) { + return _get_tarval_reachable(); +} + +tarval *(get_tarval_unreachable)(void) { + return _get_tarval_unreachable(); +} + tarval *get_tarval_max(ir_mode *mode) { assert(mode); @@ -634,6 +646,13 @@ tarval *get_tarval_all_one(ir_mode *mode) { return tarval_bad; } +int tarval_is_constant(tarval *tv) { + int num_res = sizeof(reserved_tv) / sizeof(reserved_tv[0]); + + /* reserved tarvals are NOT constants */ + return (tv < &reserved_tv[0] || tv > &reserved_tv[num_res - 1]); +} + tarval *get_tarval_minus_one(ir_mode *mode) { assert(mode); @@ -1331,7 +1350,7 @@ tarval *tarval_and(tarval *a, tarval *b) { /* * bitwise or */ -tarval *tarval_or (tarval *a, tarval *b) { +tarval *tarval_or(tarval *a, tarval *b) { assert(a); assert(b); assert(a->mode == b->mode); @@ -1568,6 +1587,10 @@ int tarval_snprintf(char *buf, size_t len, tarval *tv) { return snprintf(buf, len, ""); if (tv == tarval_undefined) return snprintf(buf, len, ""); + if (tv == tarval_unreachable) + return snprintf(buf, len, ""); + if (tv == tarval_reachable) + return snprintf(buf, len, ""); return snprintf(buf, len, ""); } @@ -1797,21 +1820,29 @@ void init_tarval_1(long null_value) { * Initialization of the tarval module: called after init_mode() */ void init_tarval_2(void) { - tarval_bad->kind = k_tarval; - tarval_bad->mode = mode_BAD; - tarval_bad->value = INT_TO_PTR(resid_tarval_bad); + tarval_bad->kind = k_tarval; + tarval_bad->mode = mode_BAD; + tarval_bad->value = INT_TO_PTR(resid_tarval_bad); + + tarval_undefined->kind = k_tarval; + tarval_undefined->mode = mode_ANY; + tarval_undefined->value = INT_TO_PTR(resid_tarval_undefined); + + tarval_b_true->kind = k_tarval; + tarval_b_true->mode = mode_b; + tarval_b_true->value = INT_TO_PTR(resid_tarval_b_true); - tarval_undefined->kind = k_tarval; - tarval_undefined->mode = mode_ANY; - tarval_undefined->value = INT_TO_PTR(resid_tarval_undefined); + tarval_b_false->kind = k_tarval; + tarval_b_false->mode = mode_b; + tarval_b_false->value = INT_TO_PTR(resid_tarval_b_false); - tarval_b_true->kind = k_tarval; - tarval_b_true->mode = mode_b; - tarval_b_true->value = INT_TO_PTR(resid_tarval_b_true); + tarval_unreachable->kind = k_tarval; + tarval_unreachable->mode = mode_X; + tarval_unreachable->value = INT_TO_PTR(resid_tarval_unreachable); - tarval_b_false->kind = k_tarval; - tarval_b_false->mode = mode_b; - tarval_b_false->value = INT_TO_PTR(resid_tarval_b_false); + tarval_reachable->kind = k_tarval; + tarval_reachable->mode = mode_X; + tarval_reachable->value = INT_TO_PTR(resid_tarval_reachable); /* * assign output modes that are compatible with the diff --git a/ir/tv/tv_t.h b/ir/tv/tv_t.h index 77503fdb3..aa6ea2c90 100644 --- a/ir/tv/tv_t.h +++ b/ir/tv/tv_t.h @@ -37,10 +37,12 @@ /** Debugging aid for the firmEvaluator: Marks for reserved tarvals values. */ enum reserved_id { - resid_tarval_bad = 1, /**< tarval_bad marker. */ - resid_tarval_undefined = 2, /**< tarval_undefined marker. */ - resid_tarval_b_false = 3, /**< tarval_b_false marker. */ - resid_tarval_b_true = 4 /**< tarval_b_true marker. */ + resid_tarval_bad = 1, /**< tarval_bad marker. */ + resid_tarval_undefined = 2, /**< tarval_undefined marker. */ + resid_tarval_b_false = 3, /**< tarval_b_false marker. */ + resid_tarval_b_true = 4, /**< tarval_b_true marker. */ + resid_tarval_unreachable = 5, /**< tarval_unreachable marker. */ + resid_tarval_reachable = 6 /**< tarval_reachable marker. */ }; /** @@ -78,10 +80,10 @@ void finish_tarval(void); * irmode.h for predefined modes */ struct tarval { - firm_kind kind; /**< must be k_tarval */ - ir_mode *mode; /**< the mode of the stored value */ - const void *value; /**< the value stored in an internal way... */ - unsigned int length; /**< the length of the stored value */ + firm_kind kind; /**< must be k_tarval */ + ir_mode *mode; /**< the mode of the stored value */ + const void *value; /**< the value stored in an internal way... */ + unsigned int length; /**< the length of the stored value */ }; /* inline functions */ @@ -90,28 +92,38 @@ struct tarval { */ static INLINE ir_mode * _get_tarval_mode(const tarval *tv) { - assert(tv); - return tv->mode; + assert(tv); + return tv->mode; } static INLINE tarval * _get_tarval_bad(void) { - return tarval_bad; + return tarval_bad; } static INLINE tarval * _get_tarval_undefined(void) { - return tarval_undefined; + return tarval_undefined; } static INLINE tarval * _get_tarval_b_false(void) { - return tarval_b_false; + return tarval_b_false; } static INLINE tarval * _get_tarval_b_true(void) { - return tarval_b_true; + return tarval_b_true; +} + +static INLINE tarval * +_get_tarval_reachable(void) { + return tarval_reachable; +} + +static INLINE tarval * +_get_tarval_unreachable(void) { + return tarval_unreachable; } static INLINE int @@ -119,12 +131,14 @@ _is_tarval(const void *thing) { return get_kind(thing) == k_tarval; } -#define get_tarval_mode(tv) _get_tarval_mode(tv) -#define get_tarval_bad() _get_tarval_bad() -#define get_tarval_undefined() _get_tarval_undefined() -#define get_tarval_b_false() _get_tarval_b_false() -#define get_tarval_b_true() _get_tarval_b_true() -#define get_tarval_P_void() _get_tarval_P_void() -#define is_tarval(thing) _is_tarval(thing) +#define get_tarval_mode(tv) _get_tarval_mode(tv) +#define get_tarval_bad() _get_tarval_bad() +#define get_tarval_undefined() _get_tarval_undefined() +#define get_tarval_b_false() _get_tarval_b_false() +#define get_tarval_b_true() _get_tarval_b_true() +#define get_tarval_unreachable() _get_tarval_unreachable() +#define get_tarval_reachable() _get_tarval_reachable() +#define get_tarval_P_void() _get_tarval_P_void() +#define is_tarval(thing) _is_tarval(thing) #endif /* FIRM_TV_TV_T_H */