diff options
author | John David Anglin <dave.anglin@nrc-cnrc.gc.ca> | 2009-07-21 00:43:42 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2009-07-21 00:43:42 +0000 |
commit | ef8d9a0e062668340eaa1ce42920f8a23715c582 (patch) | |
tree | c14e6e1a363eb5cec5e321cfd384c13b4541b149 /gcc | |
parent | 7e4bc1f8ca845c57aa04b62cc18a9a5bc5d1506e (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/pa/pa.c | 19 |
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; } |