arm.c (arm_gen_constant): Add new heuristic for generating constant integers that can be expressed as the...

* arm.c (arm_gen_constant): Add new heuristic for generating
	constant integers that can be expressed as the difference of two
	valid immediates.

From-SVN: r99474
This commit is contained in:
Richard Earnshaw 2005-05-09 22:00:06 +00:00
parent e3d97bde61
commit c87e6352ed
1 changed files with 35 additions and 0 deletions

View File

@ -1909,6 +1909,41 @@ arm_gen_constant (enum rtx_code code, enum machine_mode mode, rtx cond,
}
}
/* See if we can calculate the value as the difference between two
valid immediates. */
if (clear_sign_bit_copies + clear_zero_bit_copies <= 16)
{
int topshift = clear_sign_bit_copies & ~1;
temp1 = ((remainder + (0x00800000 >> topshift))
& (0xff000000 >> topshift));
/* If temp1 is zero, then that means the 9 most significant
bits of remainder were 1 and we've caused it to overflow.
When topshift is 0 we don't need to do anything since we
can borrow from 'bit 32'. */
if (temp1 == 0 && topshift != 0)
temp1 = 0x80000000 >> (topshift - 1);
temp2 = temp1 - remainder;
if (const_ok_for_arm (temp2))
{
if (generate)
{
rtx new_src = subtargets ? gen_reg_rtx (mode) : target;
emit_constant_insn (cond,
gen_rtx_SET (VOIDmode, new_src,
GEN_INT (temp1)));
emit_constant_insn (cond,
gen_addsi3 (target, new_src,
GEN_INT (-temp2)));
}
return 2;
}
}
/* See if we can generate this by setting the bottom (or the top)
16 bits, and then shifting these into the other half of the
word. We only look for the simplest cases, to do more would cost