From 92a4639e2eeaa74745592505e1e927b8f81b6b85 Mon Sep 17 00:00:00 2001
From: Nick Clifton <nickc@cambridge.redhat.com>
Date: Thu, 24 Jan 2002 16:27:51 +0000
Subject: [PATCH] Allow SImode values to be assigned to the stack pointer.

From-SVN: r49183
---
 gcc/ChangeLog        |  5 +++++
 gcc/config/arm/arm.c | 15 ++++++++++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9bd5fe4b3577..aa3fe7bac4e0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-01-24  Nick Clifton  <nickc@cambridge.redhat.com>
+
+	* config/arm/arm.c (arm_hard_regno_mode_ok): Allow SImode
+	values to be assigned to the stack pointer.
+
 2002-01-14  Hartmut Penner  <hpenner@de.ibm.com>
 
 	* emit_rtl.c (gen_lowpart_common): Conversion from const_int 
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 567daa373128..1999af04e4ee 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -9143,7 +9143,20 @@ arm_hard_regno_mode_ok (regno, mode)
        it only if it not a special register (SP, LR, PC) and only
        if there will be enough (non-special) registers to hold the
        entire value.  */
-    return regno < (SP_REGNUM - (unsigned) NUM_REGS (mode));
+    {
+      /* As a special exception we allow an SImode value to be
+	 "assigned" to the stack pointer.  This is not intended
+	 to actually allow a value to be stored in the SP, but so
+	 that the stack pointer can be referenced from C code like
+	 this:
+	 
+	   register char * stack_ptr asm ("sp");
+
+	 This expression is actually used in newlib...  */
+      if (mode == SImode && regno == SP_REGNUM)
+	return 1;
+      return regno < (SP_REGNUM - (unsigned) NUM_REGS (mode));
+    }
 
   if (   regno == FRAME_POINTER_REGNUM
       || regno == ARG_POINTER_REGNUM)
-- 
GitLab