Commit fa2c88a0 by Richard Earnshaw Committed by Richard Earnshaw

re PR target/21501 (ICE in extract_insn, at recog.c:2082)

	PR target/21501
	* arm.c (arm_gen_constant): Sign-extend intermediate values when
	synthesizing a constant of the difference of two immediates.

From-SVN: r99608
parent 81632f11
2005-05-12 Richard Earnshaw <richard.earnshaw@arm.com> 2005-05-12 Richard Earnshaw <richard.earnshaw@arm.com>
PR target/21501
* arm.c (arm_gen_constant): Sign-extend intermediate values when
synthesizing a constant of the difference of two immediates.
2005-05-12 Richard Earnshaw <richard.earnshaw@arm.com>
* arm/vfp.md (negsf2_vfp): Add alternative using integer registers. * arm/vfp.md (negsf2_vfp): Add alternative using integer registers.
(negdf2_vfp): Likewise. Convert to define_insn_and_split and split (negdf2_vfp): Likewise. Convert to define_insn_and_split and split
the alternatives using integer registers into the appropriate the alternatives using integer registers into the appropriate
......
...@@ -1920,8 +1920,8 @@ arm_gen_constant (enum rtx_code code, enum machine_mode mode, rtx cond, ...@@ -1920,8 +1920,8 @@ arm_gen_constant (enum rtx_code code, enum machine_mode mode, rtx cond,
{ {
int topshift = clear_sign_bit_copies & ~1; int topshift = clear_sign_bit_copies & ~1;
temp1 = ((remainder + (0x00800000 >> topshift)) temp1 = ARM_SIGN_EXTEND ((remainder + (0x00800000 >> topshift))
& (0xff000000 >> topshift)); & (0xff000000 >> topshift));
/* If temp1 is zero, then that means the 9 most significant /* If temp1 is zero, then that means the 9 most significant
bits of remainder were 1 and we've caused it to overflow. bits of remainder were 1 and we've caused it to overflow.
...@@ -1930,7 +1930,7 @@ arm_gen_constant (enum rtx_code code, enum machine_mode mode, rtx cond, ...@@ -1930,7 +1930,7 @@ arm_gen_constant (enum rtx_code code, enum machine_mode mode, rtx cond,
if (temp1 == 0 && topshift != 0) if (temp1 == 0 && topshift != 0)
temp1 = 0x80000000 >> (topshift - 1); temp1 = 0x80000000 >> (topshift - 1);
temp2 = temp1 - remainder; temp2 = ARM_SIGN_EXTEND (temp1 - remainder);
if (const_ok_for_arm (temp2)) if (const_ok_for_arm (temp2))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment