aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2009-07-21 00:43:42 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2009-07-21 00:43:42 +0000
commitef8d9a0e062668340eaa1ce42920f8a23715c582 (patch)
treec14e6e1a363eb5cec5e321cfd384c13b4541b149
parent7e4bc1f8ca845c57aa04b62cc18a9a5bc5d1506e (diff)
downloadgcc-ef8d9a0e062668340eaa1ce42920f8a23715c582.zip
gcc-ef8d9a0e062668340eaa1ce42920f8a23715c582.tar.gz
gcc-ef8d9a0e062668340eaa1ce42920f8a23715c582.tar.bz2
pa.c (compute_zdepwi_operands): Limit deposit length to 32 - lsb.
* 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: r149843
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/pa/pa.c19
2 files changed, 20 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index da82beb..c348015 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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-20 Olatunji Ruwase <tjruwase@google.com>
* cgraph.h (constant_pool_htab): New function.
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index ed64d5d..8e8db86 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -2213,9 +2213,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;
}
@@ -2234,10 +2234,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;
@@ -2246,17 +2248,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;
}