Commit ca26f665 by Richard Earnshaw Committed by Richard Earnshaw

arm.c (arm_gen_constant): Use UBFX for some AND operations when available.

	* arm.c (arm_gen_constant): Use UBFX for some AND operations when
	available.

From-SVN: r190088
parent 8812aab1
2012-08-02 Richard Earnshaw <rearnsha@arm.com>
* arm.c (arm_gen_constant): Use UBFX for some AND operations when
available.
2012-08-02 Richard Guenther <rguenther@suse.de>
* tree-into-ssa.c (struct common_info_d): New struct.
......
......@@ -2982,6 +2982,31 @@ arm_gen_constant (enum rtx_code code, enum machine_mode mode, rtx cond,
return 1;
}
/* On targets with UXTH/UBFX, we can deal with AND (2^N)-1 in a single
insn. */
if (code == AND && (i = exact_log2 (remainder + 1)) > 0
&& (arm_arch_thumb2 || (i == 16 && arm_arch6 && mode == SImode)))
{
if (generate)
{
if (mode == SImode && i == 16)
/* Use UXTH in preference to UBFX, since on Thumb2 it's a
smaller insn. */
emit_constant_insn (cond,
gen_zero_extendhisi2
(target, gen_lowpart (HImode, source)));
else
/* Extz only supports SImode, but we can coerce the operands
into that mode. */
emit_constant_insn (cond,
gen_extzv_t2 (gen_lowpart (mode, target),
gen_lowpart (mode, source),
GEN_INT (i), const0_rtx));
}
return 1;
}
/* Calculate a few attributes that may be useful for specific
optimizations. */
/* Count number of leading zeros. */
......
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