diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/arm/arm-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 24 | ||||
-rw-r--r-- | gcc/config/arm/arm.h | 3 |
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9483e53..51138d6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-08-04 Paul Brook <paul@codesourcery.com> + + * 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. + 2008-08-04 H.J. Lu <hongjiu.lu@intel.com> PR target/37012 diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index a296349..bdf9a04 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -208,4 +208,6 @@ extern void arm_lang_object_attributes_init(void); extern const char *arm_mangle_type (const_tree); +extern void arm_order_regs_for_local_alloc (void); + #endif /* ! GCC_ARM_PROTOS_H */ diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index a89229e..8b89904 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -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" diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 9f662f3..2ab44c2 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -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. */ |