Commit 29984e05 by Eric Botcazou Committed by Richard Henderson

re PR c/7102 (unsigned char divisision results in floating exception)

        PR c/7102
        * optabs.c (expand_binop): Convert CONST_INTs in all cases.

From-SVN: r56815
parent 8d46398e
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.
......
......@@ -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);
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment