Commit 795dc4fc by Paul Brook Committed by Paul Brook

arm.c (thumb_core_reg_alloc_order): New.

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.

From-SVN: r138640
parent 367a9e66
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> 2008-08-04 H.J. Lu <hongjiu.lu@intel.com>
PR target/37012 PR target/37012
......
...@@ -208,4 +208,6 @@ extern void arm_lang_object_attributes_init(void); ...@@ -208,4 +208,6 @@ extern void arm_lang_object_attributes_init(void);
extern const char *arm_mangle_type (const_tree); extern const char *arm_mangle_type (const_tree);
extern void arm_order_regs_for_local_alloc (void);
#endif /* ! GCC_ARM_PROTOS_H */ #endif /* ! GCC_ARM_PROTOS_H */
...@@ -19046,4 +19046,28 @@ arm_mangle_type (const_tree type) ...@@ -19046,4 +19046,28 @@ arm_mangle_type (const_tree type)
return NULL; 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" #include "gt-arm.h"
...@@ -1080,6 +1080,9 @@ extern int arm_structure_size_boundary; ...@@ -1080,6 +1080,9 @@ extern int arm_structure_size_boundary;
127 \ 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 /* Interrupt functions can only use registers that have already been
saved by the prologue, even if they would normally be saved by the prologue, even if they would normally be
call-clobbered. */ call-clobbered. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment