On 20/05/11 10:45, Dmitry Plotnikov wrote:
This patch adds support for 12-bit immediate values for Thumb-2 in ADD and SUB instructions. We added two new alternatives for *arm_addsi3 which make use of two new constraints for 12-bit values. Also we modified costs of PLUS rtx expression.
A already have a patch submitted for review that does all this. http://gcc.gnu.org/ml/gcc-patches/2011-04/msg01657.html
This patch reduces size of libevas by 1788 bytes (from 464916 to 463128), and sqlite by 54 bytes (from 266156 to 266052). Regtested with Cortex-A8 QEMU.
I also have another patch that improves support for thumb2 replicated constants. I'd be interested whether the patch makes a difference to your benchmark?
http://gcc.gnu.org/ml/gcc-patches/2011-04/msg01757.html (approved, but blocked on the addw/subw review).
+/* Return TRUE if int I is a valid immediate THUMB-2 constant in add/sub + * instructions in 12 bit encoding variants. */ + +int +const_ok_for_thumb2_12bit (HOST_WIDE_INT i) +{ + /* According to Thumb-2 instruction set manual such constants should be + * in range 0-4095. */ + if ((i& ~(unsigned HOST_WIDE_INT) 0xfff) == 0) + return TRUE; + + return FALSE; +}
As Richard and Chung-Lin said, we have const_ok_for_op for this sort of thing. I already patched it for movw 16-bit constants, and my patch above covers addw and subw.
@@ -7164,7 +7179,10 @@ arm_rtx_costs_1 (rtx x, enum rtx_code outer, int* total, bool speed) case CONST_INT: if (const_ok_for_arm (INTVAL (x)) - || const_ok_for_arm (~INTVAL (x))) + || const_ok_for_arm (~INTVAL (x)) + || (TARGET_THUMB2&& (outer == PLUS) + && (const_ok_for_thumb2_12bit (INTVAL (x)) + || const_ok_for_thumb2_12bit (~INTVAL (x))))) *total = COSTS_N_INSNS (1); else *total = COSTS_N_INSNS (arm_gen_constant (SET, mode, NULL_RTX,
I think my patch may be missing this bit - good catch. It really should be recast in terms of const_ok_for_op, though.
+ add%?\\t%0, %1, %2 + sub%?\\t%0, %1, #%n2
This looks wrong. add and sub only support 8-bit constants. You'd need addw and subw here.
Andrew