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]

Re: [patch] A minor improvement for ARM setjmp and longjmp


Patch applied.

-- Jeff J.

Kazu Hirata wrote:
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]