genrecog.c (print_host_wide_int): New.
authorRichard Henderson <rth@redhat.com>
Thu, 18 Dec 2003 22:10:06 +0000 (14:10 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 18 Dec 2003 22:10:06 +0000 (14:10 -0800)
        * genrecog.c (print_host_wide_int): New.
        (write_switch, write_cond): Use it.

From-SVN: r74806

gcc/ChangeLog
gcc/genrecog.c

index 39b799c6c592435854d649ee1c0d135789d79d56..977262e15ff22b9c756c8e1841f5255ec551cb76 100644 (file)
@@ -1,3 +1,8 @@
+2003-12-18  Richard Henderson  <rth@redhat.com>
+
+       * genrecog.c (print_host_wide_int): New.
+       (write_switch, write_cond): Use it.
+
 2003-12-18  Richard Henderson  <rth@redhat.com>
 
        * c-decl.c (check_bitfield_type_and_width): Remove enum special
index adf81dd70a2a4e0da4c52f992d1f1b3a069f7437..208ea8e57f26ad87dddcfa4e56f706736c772c5d 100644 (file)
@@ -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: