mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-20 15:49:54 +08:00
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
This commit is contained in:
parent
8d46398edf
commit
29984e05ae
@ -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.
|
||||
|
20
gcc/optabs.c
20
gcc/optabs.c
@ -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);
|
||||
|
19
gcc/testsuite/gcc.c-torture/execute/20020904-1.c
Normal file
19
gcc/testsuite/gcc.c-torture/execute/20020904-1.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user