Mercurial > hg > CbC > CbC_gcc
comparison 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 |
comparison
equal
deleted
inserted
replaced
19:58ad6c70ea60 | 36:855418dad1a3 |
---|---|
2215 if ((imm & 0x10) == 0) | 2215 if ((imm & 0x10) == 0) |
2216 len = (lsb <= 28) ? 4 : 32 - lsb; | 2216 len = (lsb <= 28) ? 4 : 32 - lsb; |
2217 else | 2217 else |
2218 { | 2218 { |
2219 /* Find the width of the bitstring in IMM. */ | 2219 /* Find the width of the bitstring in IMM. */ |
2220 for (len = 5; len < 32; len++) | 2220 for (len = 5; len < 32 - lsb; len++) |
2221 { | 2221 { |
2222 if ((imm & (1 << len)) == 0) | 2222 if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0) |
2223 break; | 2223 break; |
2224 } | 2224 } |
2225 | 2225 |
2226 /* Sign extend IMM as a 5-bit value. */ | 2226 /* Sign extend IMM as a 5-bit value. */ |
2227 imm = (imm & 0xf) - 0x10; | 2227 imm = (imm & 0xf) - 0x10; |
2236 useful for copying IMM to a register using the depdi,z | 2236 useful for copying IMM to a register using the depdi,z |
2237 instructions. Store the immediate value to insert in OP[0]. */ | 2237 instructions. Store the immediate value to insert in OP[0]. */ |
2238 void | 2238 void |
2239 compute_zdepdi_operands (unsigned HOST_WIDE_INT imm, unsigned *op) | 2239 compute_zdepdi_operands (unsigned HOST_WIDE_INT imm, unsigned *op) |
2240 { | 2240 { |
2241 HOST_WIDE_INT lsb, len; | 2241 int lsb, len, maxlen; |
2242 | |
2243 maxlen = MIN (HOST_BITS_PER_WIDE_INT, 64); | |
2242 | 2244 |
2243 /* Find the least significant set bit in IMM. */ | 2245 /* Find the least significant set bit in IMM. */ |
2244 for (lsb = 0; lsb < HOST_BITS_PER_WIDE_INT; lsb++) | 2246 for (lsb = 0; lsb < maxlen; lsb++) |
2245 { | 2247 { |
2246 if ((imm & 1) != 0) | 2248 if ((imm & 1) != 0) |
2247 break; | 2249 break; |
2248 imm >>= 1; | 2250 imm >>= 1; |
2249 } | 2251 } |
2250 | 2252 |
2251 /* Choose variants based on *sign* of the 5-bit field. */ | 2253 /* Choose variants based on *sign* of the 5-bit field. */ |
2252 if ((imm & 0x10) == 0) | 2254 if ((imm & 0x10) == 0) |
2253 len = ((lsb <= HOST_BITS_PER_WIDE_INT - 4) | 2255 len = (lsb <= maxlen - 4) ? 4 : maxlen - lsb; |
2254 ? 4 : HOST_BITS_PER_WIDE_INT - lsb); | |
2255 else | 2256 else |
2256 { | 2257 { |
2257 /* Find the width of the bitstring in IMM. */ | 2258 /* Find the width of the bitstring in IMM. */ |
2258 for (len = 5; len < HOST_BITS_PER_WIDE_INT; len++) | 2259 for (len = 5; len < maxlen - lsb; len++) |
2259 { | 2260 { |
2260 if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0) | 2261 if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0) |
2261 break; | 2262 break; |
2262 } | 2263 } |
2264 | |
2265 /* Extend length if host is narrow and IMM is negative. */ | |
2266 if (HOST_BITS_PER_WIDE_INT == 32 && len == maxlen - lsb) | |
2267 len += 32; | |
2263 | 2268 |
2264 /* Sign extend IMM as a 5-bit value. */ | 2269 /* Sign extend IMM as a 5-bit value. */ |
2265 imm = (imm & 0xf) - 0x10; | 2270 imm = (imm & 0xf) - 0x10; |
2266 } | 2271 } |
2267 | 2272 |