From: Alexandre Oliva Date: Sun, 6 May 2001 19:47:15 +0000 (+0000) Subject: optabs.c (expand_binop): Sign-extend xop0 and xop1 from the widest mode in narrowing... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3c04502e2b0443114b2057dd2383308b3078cf7c;p=gcc.git optabs.c (expand_binop): Sign-extend xop0 and xop1 from the widest mode in narrowing and widening operations. * optabs.c (expand_binop): Sign-extend xop0 and xop1 from the widest mode in narrowing and widening operations. From-SVN: r41885 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aee84f7d42f..9074e177d29 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2001-05-06 Alexandre Oliva + * optabs.c (expand_binop): Sign-extend xop0 and xop1 from the + widest mode in narrowing and widening operations. + * config/mips/mips.md: Sign extend CONST_INTs. 2001-05-06 Andreas Jaeger diff --git a/gcc/optabs.c b/gcc/optabs.c index 4068fa863db..c6da81592fd 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -725,13 +725,20 @@ 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. */ + 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. */ 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, xop0, unsignedp); @@ -740,6 +747,9 @@ 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) + ? mode : mode1, xop1, unsignedp);