Tweak Thumb register allocation order.
Paul Brook
paul@codesourcery.com
Mon Aug 4 16:29:00 GMT 2008
The arm backend is currently setup to allocate r12(ip) before call clobbered
low register (r4-r7). However in thumb mode using a high register is often
more expensive than saving an additional low register. The patch below
defines ORDER_REGS_FOR_LOCAL_ALLOC to correct this.
Tested on arm-none-eabi.
Applied to SVN trunk.
Paul
2008-08-04 Paul Brook <paul@codesourcery.com>
gcc/
* cofig/arm/arm.c (thumb_core_reg_alloc_order): New.
(arm_order_regs_for_local_alloc): New function.
* config/arm/arm-protos.h (arm_order_regs_for_local_alloc): Add
prototype.
* config/arm/arm.h (ORDER_REGS_FOR_LOCAL_ALLOC): Define.
Index: gcc/config/arm/arm.c
===================================================================
--- gcc/config/arm/arm.c (revision 138613)
+++ gcc/config/arm/arm.c (working copy)
@@ -19046,4 +19046,28 @@ arm_mangle_type (const_tree type)
return NULL;
}
+/* Order of allocation of core registers for Thumb: this allocation is
+ written over the corresponding initial entries of the array
+ initialized with REG_ALLOC_ORDER. We allocate all low registers
+ first. Saving and restoring a low register is usually cheaper than
+ using a call-clobbered high register. */
+
+static const int thumb_core_reg_alloc_order[] =
+{
+ 3, 2, 1, 0, 4, 5, 6, 7,
+ 14, 12, 8, 9, 10, 11, 13, 15
+};
+
+/* Adjust register allocation order when compiling for Thumb. */
+
+void
+arm_order_regs_for_local_alloc (void)
+{
+ const int arm_reg_alloc_order[] = REG_ALLOC_ORDER;
+ memcpy(reg_alloc_order, arm_reg_alloc_order, sizeof (reg_alloc_order));
+ if (TARGET_THUMB)
+ memcpy (reg_alloc_order, thumb_core_reg_alloc_order,
+ sizeof (thumb_core_reg_alloc_order));
+}
+
#include "gt-arm.h"
Index: gcc/config/arm/arm.h
===================================================================
--- gcc/config/arm/arm.h (revision 138613)
+++ gcc/config/arm/arm.h (working copy)
@@ -1080,6 +1080,9 @@ extern int arm_structure_size_boundary;
127 \
}
+/* Use different register alloc ordering for Thumb. */
+#define ORDER_REGS_FOR_LOCAL_ALLOC arm_order_regs_for_local_alloc ()
+
/* Interrupt functions can only use registers that have already been
saved by the prologue, even if they would normally be
call-clobbered. */
Index: gcc/config/arm/arm-protos.h
===================================================================
--- gcc/config/arm/arm-protos.h (revision 138613)
+++ gcc/config/arm/arm-protos.h (working copy)
@@ -208,4 +208,6 @@ extern void arm_lang_object_attributes_i
extern const char *arm_mangle_type (const_tree);
+extern void arm_order_regs_for_local_alloc (void);
+
#endif /* ! GCC_ARM_PROTOS_H */
More information about the Gcc-patches
mailing list