diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1997-02-15 08:42:02 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1997-02-15 08:42:02 -0500 |
commit | dc38b29226a6f90a4d38f92a265479371c5a17dc (patch) | |
tree | 2d59a46a1e5e307b82faf9ba6fd616174a93749a /gcc/expmed.c | |
parent | 2d20490118113ac8f4399720d721fcfa9a1bfcf8 (diff) |
(expand_divmod): prefer divmod in same mode over div in wider mode.
From-SVN: r13638
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index 4b569b1557c..65fb007da57 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3661,11 +3661,18 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) return gen_lowpart (mode, remainder); } - /* Produce the quotient. */ - /* Try a quotient insn, but not a library call. */ - quotient = sign_expand_binop (compute_mode, udiv_optab, sdiv_optab, - op0, op1, rem_flag ? NULL_RTX : target, - unsignedp, OPTAB_WIDEN); + /* Produce the quotient. Try a quotient insn, but not a library call. + If we have a divmod in this mode, use it in preference to widening + the div (for this test we assume it will not fail). Note that optab2 + is set to the one of the two optabs that the call below will use. */ + quotient + = sign_expand_binop (compute_mode, udiv_optab, sdiv_optab, + op0, op1, rem_flag ? NULL_RTX : target, + unsignedp, + ((optab2->handlers[(int) compute_mode].insn_code + != CODE_FOR_nothing) + ? OPTAB_DIRECT : OPTAB_WIDEN)); + if (quotient == 0) { /* No luck there. Try a quotient-and-remainder insn, |