This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] A minor improvement for ARM setjmp and longjmp


Hi,

Attached is a patch to make a minor improvement for ARM setjmp and
longjmp.

A while ago, Nick fixed the problem of trying to save SP with STMEA in

http://sourceware.org/ml/newlib/2008/msg00222.html

Meanwhile, Paul independently came up with an alternative fix.

Note that IP is a call-clobbered register.  As such, we do not have to
save or restore it.  We can take advantage of this fact and ask STMEA
to save IP after copying SP to IP.  This way, we are effectively
saving SP without violating the constraints on STMEA.  We also get to
reduce the number of loads by one.

OK to apply?

Kazu Hirata

2009-05-06  Paul Brook  <paul@codesourcery.com>

	* libc/machine/arm/setjmp.S: Don't bother saving IP.  Copy SP to
	IP before saving.  Likewise when restoring.

Index: newlib/libc/machine/arm/setjmp.S
===================================================================
RCS file: /cvs/src/src/newlib/libc/machine/arm/setjmp.S,v
retrieving revision 1.3
diff -u -d -p -r1.3 setjmp.S
--- newlib/libc/machine/arm/setjmp.S	25 Apr 2008 09:02:40 -0000	1.3
+++ newlib/libc/machine/arm/setjmp.S	5 May 2009 16:13:46 -0000
@@ -121,8 +121,8 @@ SYM (\name):
 
 	/* Save all the callee-preserved registers into the jump buffer.  */
 #ifdef __thumb2__
+	mov		ip, sp
 	stmea		a1!, { v1-v7, fp, ip, lr }
-	str		sp, [a1],#+4
 #else
 	stmea		a1!, { v1-v7, fp, ip, sp, lr }
 #endif
@@ -149,7 +149,7 @@ SYM (\name):
 	/* Restore the registers, retrieving the state when setjmp() was called.  */
 #ifdef __thumb2__
 	ldmfd		a1!, { v1-v7, fp, ip, lr }
-	ldr		sp, [a1],#+4
+	mov		sp, ip
 #else
 	ldmfd		a1!, { v1-v7, fp, ip, sp, lr }
 #endif


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]