diff options
author | Paul Brook <paul@codesourcery.com> | 2004-10-13 12:48:03 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2004-10-13 12:48:03 +0000 |
commit | fe0134355812ffb0ec6db616ab941665d44271a4 (patch) | |
tree | 9e1ec55997d4c7d59de1381ab1cb751f01a7c79d /gcc | |
parent | f0ec2b9a2955ef7e8009aaef727600cd28b6fc12 (diff) | |
download | gcc-fe0134355812ffb0ec6db616ab941665d44271a4.zip gcc-fe0134355812ffb0ec6db616ab941665d44271a4.tar.gz gcc-fe0134355812ffb0ec6db616ab941665d44271a4.tar.bz2 |
arm-protos.h (arm_load_pic_register): Update prototype.
* config/arm/arm-protos.h (arm_load_pic_register): Update prototype.
* config/arm/arm.c (thumb_find_work_register): Update comments.
(arm_load_pic_register): Add argument for scratch register.
(arm_expand_prologue, thumb_expand_prologue): Pass extra argument.
* config/arm/arm.md (builtin_setjmp_receiver): Ditto.
From-SVN: r88982
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/arm/arm-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 19 | ||||
-rw-r--r-- | gcc/config/arm/arm.md | 4 |
4 files changed, 22 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1c84c5d..57bdab3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-10-13 Paul Brook <paul@codesourcery.com> + + * config/arm/arm-protos.h (arm_load_pic_register): Update prototype. + * config/arm/arm.c (thumb_find_work_register): Update comments. + (arm_load_pic_register): Add argument for scratch register. + (arm_expand_prologue, thumb_expand_prologue): Pass extra argument. + * config/arm/arm.md (builtin_setjmp_receiver): Ditto. + 2004-10-13 Kazu Hirata <kazu@cs.umass.edu> * tree-data-ref.c: Fix comment typos. @@ -30,7 +38,7 @@ * gcse.c (remove_reachable_equiv_notes): Use ei_container(). 2004-10-11 Sebastian Pop <pop@cri.ensmp.fr> - + * Makefile.in (tree-ssa-loop-niter.o): Depends on tree-data-ref.h. * cfgloop.c (initialize_loops_parallel_p): New. (flow_loops_find): Initialize the parallel_p field to true for all diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index 7a75002..44a259f 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -27,7 +27,7 @@ extern void arm_override_options (void); extern int use_return_insn (int, rtx); extern int arm_regno_class (int); -extern void arm_load_pic_register (void); +extern void arm_load_pic_register (unsigned int); extern int arm_volatile_func (void); extern const char *arm_output_epilogue (rtx); extern void arm_expand_prologue (void); diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 3fe1d28..02ee7ca 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -3023,7 +3023,8 @@ thumb_find_work_register (int live_regs_mask) if (!regs_ever_live[LAST_ARG_REGNUM]) return LAST_ARG_REGNUM; - /* Look for a pushed register. */ + /* Look for a pushed register. This is used before the frame pointer is + setup, so r7 is a candidate. */ for (reg = LAST_LO_REGNUM; reg >=0; reg--) if (live_regs_mask & (1 << reg)) return reg; @@ -3033,10 +3034,11 @@ thumb_find_work_register (int live_regs_mask) } -/* Generate code to load the PIC register. */ +/* Generate code to load the PIC register. In thumb mode SCRATCH is a + low register. */ void -arm_load_pic_register (void) +arm_load_pic_register (unsigned int scratch) { #ifndef AOF_ASSEMBLER rtx l1, pic_tmp, pic_tmp2, pic_rtx; @@ -3071,12 +3073,9 @@ arm_load_pic_register (void) { if (REGNO (pic_offset_table_rtx) > LAST_LO_REGNUM) { - int reg; - /* We will have pushed the pic register, so should always be able to find a work register. */ - reg = thumb_find_work_register (thumb_compute_save_reg_mask ()); - pic_tmp = gen_rtx_REG (SImode, reg); + pic_tmp = gen_rtx_REG (SImode, scratch); emit_insn (gen_pic_load_addr_thumb (pic_tmp, pic_rtx)); emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp)); } @@ -10237,7 +10236,7 @@ arm_expand_prologue (void) if (flag_pic) - arm_load_pic_register (); + arm_load_pic_register (INVALID_REGNUM); /* If we are profiling, make sure no instructions are scheduled before the call to mcount. Similarly if the user has requested no @@ -12964,10 +12963,11 @@ thumb_expand_prologue (void) return; } + live_regs_mask = thumb_compute_save_reg_mask (); /* Load the pic register before setting the frame pointer, so we can use r7 as a temporary work register. */ if (flag_pic) - arm_load_pic_register (); + arm_load_pic_register (thumb_find_work_register (live_regs_mask)); offsets = arm_get_frame_offsets (); @@ -12978,7 +12978,6 @@ thumb_expand_prologue (void) RTX_FRAME_RELATED_P (insn) = 1; } - live_regs_mask = thumb_compute_save_reg_mask (); amount = offsets->outgoing_args - offsets->saved_regs; if (amount) { diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 86113e7..6c07a85 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -4459,7 +4459,9 @@ "flag_pic" " { - arm_load_pic_register (); + /* r3 is clobbered by set/longjmp, so we can use it as a scratch + register. */ + arm_load_pic_register (3); DONE; }") |