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
This commit is contained in:
Paul Brook 2008-08-04 16:27:17 +00:00 committed by Paul Brook
parent 367a9e66e0
commit 795dc4fc90
4 changed files with 37 additions and 0 deletions

View file

@ -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

View file

@ -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 */

View file

@ -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"

View file

@ -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. */