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