]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/7102 (unsigned char divisision results in floating exception)
authorEric Botcazou <ebotcazou@multimania.com>
Wed, 4 Sep 2002 22:24:12 +0000 (22:24 +0000)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 4 Sep 2002 22:24:12 +0000 (15:24 -0700)
        PR c/7102
        * optabs.c (expand_binop): Convert CONST_INTs in all cases.

From-SVN: r56815

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

index 7b8e319ab6fb9c076c5d8242f5e4011951f08031..ae3918f66d6ceaed56d5e6aa5e043bcb4a1ba8bc 100644 (file)
@@ -1,3 +1,8 @@
+2002-09-04  Eric Botcazou  <ebotcazou@multimania.com>
+
+       PR c/7102
+       * optabs.c (expand_binop): Convert CONST_INTs in all cases.
+
 2002-09-04  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * pa.md (setccfp0, setccfp1): New patterns.
index 3f17034f0d51de25866143fdc1e9e5ff27f80fd0..a7dae46dbcb81a2d80c733e897beed243f13cd58 100644 (file)
@@ -779,23 +779,18 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
        }
 
       /* In case the insn wants input operands in modes different from
-        the result, convert the operands.  It would seem that we
-        don't need to convert CONST_INTs, but we do, so that they're
-        a properly sign-extended for their modes; we choose the
-        widest mode between mode and mode[01], so that, in a widening
-        operation, we call convert_modes with different FROM and TO
-        modes, which ensures the value is sign-extended.  Shift
-        operations are an exception, because the second operand needs
-        not be extended to the mode of the result.  */
+        those of the actual operands, convert the operands.  It would
+        seem that we don't need to convert CONST_INTs, but we do, so
+        that they're properly zero-extended or sign-extended for their
+        modes; shift operations are an exception, because the second
+        operand needs not be extended to the mode of the result.  */
 
       if (GET_MODE (op0) != mode0
          && mode0 != VOIDmode)
        xop0 = convert_modes (mode0,
                              GET_MODE (op0) != VOIDmode
                              ? GET_MODE (op0)
-                             : GET_MODE_SIZE (mode) > GET_MODE_SIZE (mode0)
-                             ? mode
-                             : mode0,
+                             : mode,
                              xop0, unsignedp);
 
       if (GET_MODE (xop1) != mode1
@@ -803,8 +798,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
        xop1 = convert_modes (mode1,
                              GET_MODE (op1) != VOIDmode
                              ? GET_MODE (op1)
-                             : (GET_MODE_SIZE (mode) > GET_MODE_SIZE (mode1)
-                                && ! shift_op)
+                             : ! shift_op
                              ? mode
                              : mode1,
                              xop1, unsignedp);
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020904-1.c b/gcc/testsuite/gcc.c-torture/execute/20020904-1.c
new file mode 100644 (file)
index 0000000..24eeb0c
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR c/7102 */
+
+/* Verify that GCC zero-extends integer constants
+   in unsigned binary operations. */
+
+typedef unsigned char u8;
+
+u8 fun(u8 y)
+{
+  u8 x=((u8)255)/y;
+  return x;
+}
+
+int main(void)
+{
+  if (fun((u8)2) != 127)
+    abort ();
+  return 0;
+}