From 4f2ca7f5242367c32aa8ca848bfdf1d5cacd7d8b Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 18 Dec 2003 14:10:06 -0800 Subject: genrecog.c (print_host_wide_int): New. * genrecog.c (print_host_wide_int): New. (write_switch, write_cond): Use it. From-SVN: r74806 --- gcc/ChangeLog | 5 +++++ gcc/genrecog.c | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39b799c..977262e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2003-12-18 Richard Henderson + * genrecog.c (print_host_wide_int): New. + (write_switch, write_cond): Use it. + +2003-12-18 Richard Henderson + * c-decl.c (check_bitfield_type_and_width): Remove enum special case suppression of pedwarn. * system.h (ENUM_BITFIELD): Use __extension__. diff --git a/gcc/genrecog.c b/gcc/genrecog.c index adf81dd..208ea8e 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -1734,6 +1734,20 @@ write_afterward (struct decision *start, struct decision *afterward, } } +/* Emit a HOST_WIDE_INT as an integer constant expression. We need to take + special care to avoid "decimal constant is so large that it is unsigned" + warnings in the resulting code. */ + +static void +print_host_wide_int (HOST_WIDE_INT val) +{ + HOST_WIDE_INT min = (unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1); + if (val == min) + printf ("(" HOST_WIDE_INT_PRINT_DEC_C "-1)", val + 1); + else + printf (HOST_WIDE_INT_PRINT_DEC_C, val); +} + /* Emit a switch statement, if possible, for an initial sequence of nodes at START. Return the first node yet untested. */ @@ -1907,7 +1921,7 @@ write_switch (struct decision *start, int depth) case DT_elt_one_int: case DT_elt_zero_wide: case DT_elt_zero_wide_safe: - printf (HOST_WIDE_INT_PRINT_DEC_C, p->tests->u.intval); + print_host_wide_int (p->tests->u.intval); break; default: abort (); @@ -1964,7 +1978,7 @@ write_cond (struct decision_test *p, int depth, case DT_elt_zero_wide: case DT_elt_zero_wide_safe: printf ("XWINT (x%d, 0) == ", depth); - printf (HOST_WIDE_INT_PRINT_DEC_C, p->u.intval); + print_host_wide_int (p->u.intval); break; case DT_veclen_ge: -- cgit v1.1