From 795dc4fc9010a608ed06857c4781f0c51b839431 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Mon, 4 Aug 2008 16:27:17 +0000 Subject: [PATCH] arm.c (thumb_core_reg_alloc_order): New. 2008-08-04 Paul Brook 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. From-SVN: r138640 --- gcc/ChangeLog | 8 ++++++++ gcc/config/arm/arm-protos.h | 2 ++ gcc/config/arm/arm.c | 24 ++++++++++++++++++++++++ gcc/config/arm/arm.h | 3 +++ 4 files changed, 37 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9483e5379862..51138d63eb19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-08-04 Paul Brook + + * 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 PR target/37012 diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index a2963494c480..bdf9a04416b9 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 a89229ec12ac..8b89904ffa18 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 9f662f312977..2ab44c244834 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. */