* arm.c (const_ok_for_arm): Use a faster algorithm.

From-SVN: r99476
This commit is contained in:
Richard Earnshaw 2005-05-09 22:09:47 +00:00 committed by Richard Earnshaw
parent 4a6ac6a5e6
commit 4642ccb1d0
2 changed files with 22 additions and 13 deletions

View file

@ -1,3 +1,7 @@
2005-05-09 Richard Earnshaw <richard.earnshaw@arm.com>
* arm.c (const_ok_for_arm): Use a faster algorithm.
2005-05-09 David Edelsohn <edelsohn@gnu.org>
PR target/21477

View file

@ -1531,8 +1531,8 @@ use_return_insn (int iscond, rtx sibling)
int
const_ok_for_arm (HOST_WIDE_INT i)
{
unsigned HOST_WIDE_INT mask = ~(unsigned HOST_WIDE_INT)0xFF;
int lowbit;
/* For machines with >32 bit HOST_WIDE_INT, the bits above bit 31 must
be all zero, or all one. */
if ((i & ~(unsigned HOST_WIDE_INT) 0xffffffff) != 0
@ -1541,19 +1541,24 @@ const_ok_for_arm (HOST_WIDE_INT i)
& ~(unsigned HOST_WIDE_INT) 0xffffffff)))
return FALSE;
/* Fast return for 0 and powers of 2 */
if ((i & (i - 1)) == 0)
i &= (unsigned HOST_WIDE_INT) 0xffffffff;
/* Fast return for 0 and small values. We must do this for zero, since
the code below can't handle that one case. */
if ((i & ~(unsigned HOST_WIDE_INT) 0xff) == 0)
return TRUE;
do
{
if ((i & mask & (unsigned HOST_WIDE_INT) 0xffffffff) == 0)
return TRUE;
mask =
(mask << 2) | ((mask & (unsigned HOST_WIDE_INT) 0xffffffff)
>> (32 - 2)) | ~(unsigned HOST_WIDE_INT) 0xffffffff;
}
while (mask != ~(unsigned HOST_WIDE_INT) 0xFF);
/* Get the number of trailing zeros, rounded down to the nearest even
number. */
lowbit = (ffs ((int) i) - 1) & ~1;
if ((i & ~(((unsigned HOST_WIDE_INT) 0xff) << lowbit)) == 0)
return TRUE;
else if (lowbit <= 4
&& ((i & ~0xc000003f) == 0
|| (i & ~0xf000000f) == 0
|| (i & ~0xfc000003) == 0))
return TRUE;
return FALSE;
}