aboutsummaryrefslogtreecommitdiff
path: root/gcc/expmed.c
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@gnu.org>2004-09-12 20:05:30 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2004-09-12 16:05:30 -0400
commit3d520aaf7d3b6812a46efb99b20063b89d1bb524 (patch)
tree64177dd93f46d8007e54530a6263757da7cd383b /gcc/expmed.c
parentc92d8761c7f6814e8ed7734aff920a40240ad43b (diff)
downloadgcc-3d520aaf7d3b6812a46efb99b20063b89d1bb524.zip
gcc-3d520aaf7d3b6812a46efb99b20063b89d1bb524.tar.gz
gcc-3d520aaf7d3b6812a46efb99b20063b89d1bb524.tar.bz2
re PR middle-end/16795 (PowerPC - Divide sequences by negative power of two could be more efficient)
PR target/16795 * expmed.c (expand_divmod): If cheap power of 2 divide is available, use it for negative constant as well. From-SVN: r87403
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r--gcc/expmed.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index fe9aeb5..eb8226d 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -3764,7 +3764,19 @@ expand_divmod (int rem_flag, enum tree_code code, enum machine_mode mode,
if (remainder)
return gen_lowpart (mode, remainder);
}
- quotient = expand_sdiv_pow2 (compute_mode, op0, abs_d);
+
+ if (sdiv_pow2_cheap[compute_mode]
+ && ((sdiv_optab->handlers[compute_mode].insn_code
+ != CODE_FOR_nothing)
+ || (sdivmod_optab->handlers[compute_mode].insn_code
+ != CODE_FOR_nothing)))
+ quotient = expand_divmod (0, TRUNC_DIV_EXPR,
+ compute_mode, op0,
+ gen_int_mode (abs_d,
+ compute_mode),
+ NULL_RTX, 0);
+ else
+ quotient = expand_sdiv_pow2 (compute_mode, op0, abs_d);
/* We have computed OP0 / abs(OP1). If OP1 is negative,
negate the quotient. */