summaryrefslogtreecommitdiff
path: root/gcc/genrecog.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2003-12-18 22:10:06 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2003-12-18 22:10:06 +0000
commitad85fb32ad6eca009e3f1228f99985491d95159c (patch)
treed5bb985b417ee92e791b0c01e0418b21679eca8b /gcc/genrecog.c
parente638f2e5164268bc1d005fb9df52bd92934b4e84 (diff)
downloadgcc-ad85fb32ad6eca009e3f1228f99985491d95159c.tar.gz
* genrecog.c (print_host_wide_int): New.
(write_switch, write_cond): Use it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74806 138bc75d-0d04-0410-961f-82ee72b054a4
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 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: