diff options
author | DJ Delorie <dj@redhat.com> | 2009-07-31 00:59:45 -0400 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2009-07-31 00:59:45 -0400 |
commit | 20e19db49ec468766f78a6d3a0f3b69980be2974 (patch) | |
tree | 169c07117c4dd277b8bdd8871069c4ab09f34342 | |
parent | e60d414986c11bed356d02c1a4a9b8cf4c00c675 (diff) | |
download | gcc-20e19db49ec468766f78a6d3a0f3b69980be2974.zip gcc-20e19db49ec468766f78a6d3a0f3b69980be2974.tar.gz gcc-20e19db49ec468766f78a6d3a0f3b69980be2974.tar.bz2 |
sh.md (UNSPECV_SP_SWITCH_B): New.
* config/sh/sh.md (UNSPECV_SP_SWITCH_B): New.
(UNSPECV_SP_SWITCH_E): New.
(sp_switch_1): Change to an unspec.
(sp_switch_2): Change to an unspec. Don't use post-inc when we
replace $r15.
* config/sh/sh.c (sh_expand_prologue): Use the constant pool to
reference the new stack's address
From-SVN: r150306
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/sh/sh.c | 10 |
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5c6a4f..6f24540 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2009-07-31 DJ Delorie <dj@redhat.com> + + * config/sh/sh.md (UNSPECV_SP_SWITCH_B): New. + (UNSPECV_SP_SWITCH_E): New. + (sp_switch_1): Change to an unspec. + (sp_switch_2): Change to an unspec. Don't use post-inc when we + replace $r15. + * config/sh/sh.c (sh_expand_prologue): Use the constant pool to + reference the new stack's address + 2009-07-30 Sebastian Pop <sebastian.pop@amd.com> * Makefile.in (OBJS-common): Added dependence on graphite-blocking.o, diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 788b0fe..5b555f8 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -6743,13 +6743,19 @@ sh_expand_prologue (void) /* If we're supposed to switch stacks at function entry, do so now. */ if (sp_switch_attr) { + rtx lab, newsrc; /* The argument specifies a variable holding the address of the stack the interrupt function should switch to/from at entry/exit. */ + tree arg = TREE_VALUE ( TREE_VALUE (sp_switch_attr)); const char *s - = ggc_strdup (TREE_STRING_POINTER (TREE_VALUE (sp_switch_attr))); + = ggc_strdup (TREE_STRING_POINTER (arg)); rtx sp_switch = gen_rtx_SYMBOL_REF (Pmode, s); - emit_insn (gen_sp_switch_1 (sp_switch)); + lab = add_constant (sp_switch, SImode, 0); + newsrc = gen_rtx_LABEL_REF (VOIDmode, lab); + newsrc = gen_const_mem (SImode, newsrc); + + emit_insn (gen_sp_switch_1 (newsrc)); } d = calc_live_regs (&live_regs_mask); |