]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
pa.c (compute_zdepwi_operands): Limit deposit length to 32 - lsb.
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Mon, 27 Jul 2009 15:30:41 +0000 (15:30 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Mon, 27 Jul 2009 15:30:41 +0000 (15:30 +0000)
* pa.c (compute_zdepwi_operands): Limit deposit length to 32 - lsb.
Cast "1" to unsigned HOST_WIDE_INT.
(compute_zdepdi_operands): Limit maximum length to 64 bits.  Limit
deposit length to the maximum length - lsb.  Extend length if
HOST_BITS_PER_WIDE_INT is 32.

From-SVN: r150126

gcc/ChangeLog
gcc/config/pa/pa.c

index 325d99340d77186a28a096b3db34996973d065cb..9f4bfcbe6de51c972a36d1f731f66749cc0f0719 100644 (file)
@@ -1,3 +1,14 @@
+2009-07-27  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       Backport from mainline:
+       2009-07-20  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       * pa.c (compute_zdepwi_operands): Limit deposit length to 32 - lsb.
+       Cast "1" to unsigned HOST_WIDE_INT.
+       (compute_zdepdi_operands): Limit maximum length to 64 bits.  Limit
+       deposit length to the maximum length - lsb.  Extend length if
+       HOST_BITS_PER_WIDE_INT is 32.
+
 2009-07-23  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/40832
index 51c3150e499aabf01cb79312a66c844a2f522c5c..57df9f2ff307591c2aca56e22efe3c9c0cf98db6 100644 (file)
@@ -2217,9 +2217,9 @@ compute_zdepwi_operands (unsigned HOST_WIDE_INT imm, unsigned *op)
   else
     {
       /* Find the width of the bitstring in IMM.  */
-      for (len = 5; len < 32; len++)
+      for (len = 5; len < 32 - lsb; len++)
        {
-         if ((imm & (1 << len)) == 0)
+         if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0)
            break;
        }
 
@@ -2238,10 +2238,12 @@ compute_zdepwi_operands (unsigned HOST_WIDE_INT imm, unsigned *op)
 void
 compute_zdepdi_operands (unsigned HOST_WIDE_INT imm, unsigned *op)
 {
-  HOST_WIDE_INT lsb, len;
+  int lsb, len, maxlen;
+
+  maxlen = MIN (HOST_BITS_PER_WIDE_INT, 64);
 
   /* Find the least significant set bit in IMM.  */
-  for (lsb = 0; lsb < HOST_BITS_PER_WIDE_INT; lsb++)
+  for (lsb = 0; lsb < maxlen; lsb++)
     {
       if ((imm & 1) != 0)
         break;
@@ -2250,17 +2252,20 @@ compute_zdepdi_operands (unsigned HOST_WIDE_INT imm, unsigned *op)
 
   /* Choose variants based on *sign* of the 5-bit field.  */
   if ((imm & 0x10) == 0)
-    len = ((lsb <= HOST_BITS_PER_WIDE_INT - 4)
-          ? 4 : HOST_BITS_PER_WIDE_INT - lsb);
+    len = (lsb <= maxlen - 4) ? 4 : maxlen - lsb;
   else
     {
       /* Find the width of the bitstring in IMM.  */
-      for (len = 5; len < HOST_BITS_PER_WIDE_INT; len++)
+      for (len = 5; len < maxlen - lsb; len++)
        {
          if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0)
            break;
        }
 
+      /* Extend length if host is narrow and IMM is negative.  */
+      if (HOST_BITS_PER_WIDE_INT == 32 && len == maxlen - lsb)
+       len += 32;
+
       /* Sign extend IMM as a 5-bit value.  */
       imm = (imm & 0xf) - 0x10;
     }