Mercurial > hg > CbC > CbC_gcc
diff gcc/config/pa/pa.c @ 36:855418dad1a3
gcc-4.4-20091020
author | e075725 |
---|---|
date | Tue, 22 Dec 2009 21:19:31 +0900 |
parents | a06113de4d67 |
children | 3bfb6c00c1e0 |
line wrap: on
line diff
--- a/gcc/config/pa/pa.c Thu Sep 24 13:21:57 2009 +0900 +++ b/gcc/config/pa/pa.c Tue Dec 22 21:19:31 2009 +0900 @@ -2217,9 +2217,9 @@ else { /* Find the width of the bitstring in IMM. */ - for (len = 5; len < 32; len++) - { - if ((imm & (1 << len)) == 0) + for (len = 5; len < 32 - lsb; len++) + { + if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0) break; } @@ -2238,10 +2238,12 @@ 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 @@ /* 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; }