diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2002-09-11 18:29:21 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-09-11 18:29:21 -0700 |
commit | 874f6a6d1f62dd04490e67f5c19e4621902e9dfa (patch) | |
tree | 94e139a172be90d8bc489673c65732b9c68dacbc /gcc/optabs.c | |
parent | d1df930ba1d06255ee8f0f09fbd28ed77039f48f (diff) | |
download | gcc-874f6a6d1f62dd04490e67f5c19e4621902e9dfa.tar.gz |
optabs.c (expand_binop): Minor cleanup.
* optabs.c (expand_binop): Minor cleanup.
(expand_twoval_binop): Convert CONST_INTs like in expand_binop.
From-SVN: r57046
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index a7dae46dbcb..f098aa6a092 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -783,24 +783,20 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods) 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. */ + operand need not be extended to the mode of the result. */ - if (GET_MODE (op0) != mode0 - && mode0 != VOIDmode) + if (GET_MODE (op0) != mode0 && mode0 != VOIDmode) xop0 = convert_modes (mode0, GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : mode, xop0, unsignedp); - if (GET_MODE (xop1) != mode1 - && mode1 != VOIDmode) + if (GET_MODE (op1) != mode1 && mode1 != VOIDmode) xop1 = convert_modes (mode1, GET_MODE (op1) != VOIDmode ? GET_MODE (op1) - : ! shift_op - ? mode - : mode1, + : (shift_op ? mode1 : mode), xop1, unsignedp); /* Now, if insn's predicates don't allow our operands, put them into @@ -2235,13 +2231,25 @@ expand_twoval_binop (binoptab, op0, op1, targ0, targ1, unsignedp) rtx pat; rtx xop0 = op0, xop1 = op1; - /* In case this insn wants input operands in modes different from the - result, convert the operands. */ - if (GET_MODE (op0) != VOIDmode && GET_MODE (op0) != mode0) - xop0 = convert_to_mode (mode0, xop0, unsignedp); + /* In case the insn wants input operands in modes different from + 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. */ + + if (GET_MODE (op0) != mode0 && mode0 != VOIDmode) + xop0 = convert_modes (mode0, + GET_MODE (op0) != VOIDmode + ? GET_MODE (op0) + : mode, + xop0, unsignedp); - if (GET_MODE (op1) != VOIDmode && GET_MODE (op1) != mode1) - xop1 = convert_to_mode (mode1, xop1, unsignedp); + if (GET_MODE (op1) != mode1 && mode1 != VOIDmode) + xop1 = convert_modes (mode1, + GET_MODE (op1) != VOIDmode + ? GET_MODE (op1) + : mode, + xop1, unsignedp); /* Now, if insn doesn't accept these operands, put them into pseudos. */ if (! (*insn_data[icode].operand[1].predicate) (xop0, mode0)) |