From 4f2ca7f5242367c32aa8ca848bfdf1d5cacd7d8b Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 18 Dec 2003 14:10:06 -0800 Subject: [PATCH] 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(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39b799c6c59..977262e15ff 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/genrecog.c b/gcc/genrecog.c index adf81dd70a2..208ea8e57f2 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: -- 2.30.2