diff options
author | Roger Sayle <roger@eyesopen.com> | 2004-06-15 15:06:14 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-06-15 15:06:14 +0000 |
commit | 0792ab197b3956a2631a7b46f773ba11045357bc (patch) | |
tree | e04a2fe3bce10855bce0dcd51b05d25bf50ce7ff /gcc | |
parent | 5a4f18181b64187fdfa0f0c21d6a2ca476a2469e (diff) | |
download | gcc-0792ab197b3956a2631a7b46f773ba11045357bc.zip gcc-0792ab197b3956a2631a7b46f773ba11045357bc.tar.gz gcc-0792ab197b3956a2631a7b46f773ba11045357bc.tar.bz2 |
expmed.c (synth_mult): Mask bits of the multiplier to the machine mode of the multiplication.
* expmed.c (synth_mult): Mask bits of the multiplier to the
machine mode of the multiplication. Don't consider shifts
by more than (or equal to) the width of the operation's mode.
From-SVN: r83187
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expmed.c | 14 |
2 files changed, 15 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d135dd5..e9817ab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-06-15 Roger Sayle <roger@eyesopen.com> + + * expmed.c (synth_mult): Mask bits of the multiplier to the + machine mode of the multiplication. Don't consider shifts + by more than (or equal to) the width of the operation's mode. + 2004-06-15 Paolo Bonzini <bonzini@gnu.org> * doc/install.texi: Yet another update for autoconf diff --git a/gcc/expmed.c b/gcc/expmed.c index f45de5d..bebdbe8 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -2191,6 +2191,7 @@ synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t, struct algorithm *alg_in, *best_alg; int cost; unsigned HOST_WIDE_INT q; + int maxm = MIN (BITS_PER_WORD, GET_MODE_BITSIZE (mode)); /* Indicate that no algorithm is yet found. If no algorithm is found, this value will be returned and indicate failure. */ @@ -2199,6 +2200,9 @@ synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t, if (cost_limit <= 0) return; + /* Restrict the bits of "t" to the multiplication's mode. */ + t &= GET_MODE_MASK (mode); + /* t == 1 can be done in zero cost. */ if (t == 1) { @@ -2234,7 +2238,7 @@ synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t, if ((t & 1) == 0) { m = floor_log2 (t & -t); /* m = number of low zero bits */ - if (m < BITS_PER_WORD) + if (m < maxm) { q = t >> m; cost = shift_cost[mode][m]; @@ -2319,7 +2323,7 @@ synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t, unsigned HOST_WIDE_INT d; d = ((unsigned HOST_WIDE_INT) 1 << m) + 1; - if (t % d == 0 && t > d && m < BITS_PER_WORD) + if (t % d == 0 && t > d && m < maxm) { cost = add_cost[mode] + shift_cost[mode][m]; if (shiftadd_cost[mode][m] < cost) @@ -2340,7 +2344,7 @@ synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t, } d = ((unsigned HOST_WIDE_INT) 1 << m) - 1; - if (t % d == 0 && t > d && m < BITS_PER_WORD) + if (t % d == 0 && t > d && m < maxm) { cost = add_cost[mode] + shift_cost[mode][m]; if (shiftsub_cost[mode][m] < cost) @@ -2367,7 +2371,7 @@ synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t, q = t - 1; q = q & -q; m = exact_log2 (q); - if (m >= 0 && m < BITS_PER_WORD) + if (m >= 0 && m < maxm) { cost = shiftadd_cost[mode][m]; synth_mult (alg_in, (t - 1) >> m, cost_limit - cost, mode); @@ -2386,7 +2390,7 @@ synth_mult (struct algorithm *alg_out, unsigned HOST_WIDE_INT t, q = t + 1; q = q & -q; m = exact_log2 (q); - if (m >= 0 && m < BITS_PER_WORD) + if (m >= 0 && m < maxm) { cost = shiftsub_cost[mode][m]; synth_mult (alg_in, (t + 1) >> m, cost_limit - cost, mode); |