aboutsummaryrefslogtreecommitdiff
path: root/gcc/genrecog.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-12-18 14:10:06 -0800
committerRichard Henderson <rth@gcc.gnu.org>2003-12-18 14:10:06 -0800
commit4f2ca7f5242367c32aa8ca848bfdf1d5cacd7d8b (patch)
treed5bb985b417ee92e791b0c01e0418b21679eca8b /gcc/genrecog.c
parent0b667ed86d1e3dafb25492864e181bc04cff7bba (diff)
downloadgcc-4f2ca7f5242367c32aa8ca848bfdf1d5cacd7d8b.zip
gcc-4f2ca7f5242367c32aa8ca848bfdf1d5cacd7d8b.tar.gz
gcc-4f2ca7f5242367c32aa8ca848bfdf1d5cacd7d8b.tar.bz2
genrecog.c (print_host_wide_int): New.
* genrecog.c (print_host_wide_int): New. (write_switch, write_cond): Use it. From-SVN: r74806
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r--gcc/genrecog.c18
1 files changed, 16 insertions, 2 deletions
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: