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> 2002-09-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
* pa.md (setccfp0, setccfp1): New patterns. * pa.md (setccfp0, setccfp1): New patterns.
......
...@@ -779,23 +779,18 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods) ...@@ -779,23 +779,18 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
} }
/* In case the insn wants input operands in modes different from /* In case the insn wants input operands in modes different from
the result, convert the operands. It would seem that we those of the actual operands, convert the operands. It would
don't need to convert CONST_INTs, but we do, so that they're seem that we don't need to convert CONST_INTs, but we do, so
a properly sign-extended for their modes; we choose the that they're properly zero-extended or sign-extended for their
widest mode between mode and mode[01], so that, in a widening modes; shift operations are an exception, because the second
operation, we call convert_modes with different FROM and TO operand needs not be extended to the mode of the result. */
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. */
if (GET_MODE (op0) != mode0 if (GET_MODE (op0) != mode0
&& mode0 != VOIDmode) && mode0 != VOIDmode)
xop0 = convert_modes (mode0, xop0 = convert_modes (mode0,
GET_MODE (op0) != VOIDmode GET_MODE (op0) != VOIDmode
? GET_MODE (op0) ? GET_MODE (op0)
: GET_MODE_SIZE (mode) > GET_MODE_SIZE (mode0) : mode,
? mode
: mode0,
xop0, unsignedp); xop0, unsignedp);
if (GET_MODE (xop1) != mode1 if (GET_MODE (xop1) != mode1
...@@ -803,8 +798,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods) ...@@ -803,8 +798,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
xop1 = convert_modes (mode1, xop1 = convert_modes (mode1,
GET_MODE (op1) != VOIDmode GET_MODE (op1) != VOIDmode
? GET_MODE (op1) ? GET_MODE (op1)
: (GET_MODE_SIZE (mode) > GET_MODE_SIZE (mode1) : ! shift_op
&& ! shift_op)
? mode ? mode
: mode1, : mode1,
xop1, unsignedp); 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