re PR c/5304 (gcc-20011231 generates incorrect divmod code for chars)
authorJakub Jelinek <jakub@redhat.com>
Fri, 1 Feb 2002 23:43:19 +0000 (00:43 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 1 Feb 2002 23:43:19 +0000 (00:43 +0100)
PR c/5304:
* expmed.c (expand_mult_highpart): Use immed_double_const for wide_op1
unconditionally.

* gcc.c-torture/execute/20020201-1.c: New test.

From-SVN: r49416

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20020201-1.c [new file with mode: 0644]

index 31aa4d77354b76c033f9bdd2f2637947c007365e..1ba587485d8050695055948dd31601ef1b54a897 100644 (file)
@@ -1,3 +1,9 @@
+2002-02-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/5304:
+       * expmed.c (expand_mult_highpart): Use immed_double_const for wide_op1
+       unconditionally.
+
 2002-02-01  Janis Johnson  <janis187@us.ibm.com>
 
        * cfganal.c: Include tm_p.h.
index 53ff05b4a5fd8f0b5b51a8202c98811133d51573..a26ad0946a9e7f439d26bb41d466a4122d8483a2 100644 (file)
@@ -2760,15 +2760,12 @@ expand_mult_highpart (mode, op0, cnst1, target, unsignedp, max_cost)
 
   op1 = GEN_INT (trunc_int_for_mode (cnst1, mode));
 
-  if (GET_MODE_BITSIZE (wider_mode) <= HOST_BITS_PER_INT)
-    wide_op1 = op1;
-  else
-    wide_op1
-      = immed_double_const (cnst1,
-                           (unsignedp
-                            ? (HOST_WIDE_INT) 0
-                            : -(cnst1 >> (HOST_BITS_PER_WIDE_INT - 1))),
-                           wider_mode);
+  wide_op1
+    = immed_double_const (cnst1,
+                         (unsignedp
+                          ? (HOST_WIDE_INT) 0
+                          : -(cnst1 >> (HOST_BITS_PER_WIDE_INT - 1))),
+                         wider_mode);
 
   /* expand_mult handles constant multiplication of word_mode
      or narrower.  It does a poor job for large modes.  */
index 3be0340d05238735ec26ca0a84bc21e79f77f97f..1086bb10c1e0d22bc8e1aef65dc3613e5c079b2d 100644 (file)
@@ -1,3 +1,7 @@
+2002-02-02  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/execute/20020201-1.c: New test.
+
 2002-02-01  Janis Johnson  <janis187@us.ibm.com>
 
        PR target/5469
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020201-1.c b/gcc/testsuite/gcc.c-torture/execute/20020201-1.c
new file mode 100644 (file)
index 0000000..b15f228
--- /dev/null
@@ -0,0 +1,37 @@
+/* Test whether division by constant works properly.  */
+
+extern void abort (void);
+extern void exit (int);
+
+unsigned char cx = 7;
+unsigned short sx = 14;
+unsigned int ix = 21;
+unsigned long lx = 28;
+unsigned long long Lx = 35;
+
+int
+main ()
+{
+  unsigned char cy;
+  unsigned short sy;
+  unsigned int iy;
+  unsigned long ly;
+  unsigned long long Ly;
+  
+  cy = cx / 6; if (cy != 1) abort ();
+  cy = cx % 6; if (cy != 1) abort ();
+
+  sy = sx / 6; if (sy != 2) abort ();
+  sy = sx % 6; if (sy != 2) abort ();
+
+  iy = ix / 6; if (iy != 3) abort ();
+  iy = ix % 6; if (iy != 3) abort ();
+
+  ly = lx / 6; if (ly != 4) abort ();
+  ly = lx % 6; if (ly != 4) abort ();
+
+  Ly = Lx / 6; if (Ly != 5) abort ();
+  Ly = Lx % 6; if (Ly != 5) abort ();
+
+  exit(0);
+}