expmed.c (synth_mult): Mask bits of the multiplier to the machine mode of the multipl...
authorRoger Sayle <roger@eyesopen.com>
Tue, 15 Jun 2004 15:06:14 +0000 (15:06 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Tue, 15 Jun 2004 15:06:14 +0000 (15:06 +0000)
* 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

gcc/ChangeLog
gcc/expmed.c

index d135dd5e491f33d6a51aa545dce95d3c81024bf1..e9817abeea615e49bf1cfdcd9c2e9c46cc700350 100644 (file)
@@ -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
index f45de5d56cc9a0baaf6dcab5765b5c1617040bac..bebdbe86decdba1a764bd7ad3e14b7e31fe7908e 100644 (file)
@@ -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);