aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2009-07-31 00:59:45 -0400
committerDJ Delorie <dj@gcc.gnu.org>2009-07-31 00:59:45 -0400
commit20e19db49ec468766f78a6d3a0f3b69980be2974 (patch)
tree169c07117c4dd277b8bdd8871069c4ab09f34342
parente60d414986c11bed356d02c1a4a9b8cf4c00c675 (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--gcc/config/sh/sh.c10
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);