From 3c04502e2b0443114b2057dd2383308b3078cf7c Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Sun, 6 May 2001 19:47:15 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 3 +++ gcc/optabs.c | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) 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); -- 2.30.2