Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2009-05-13 22:28:49 +0400
committerJeff Johnston <jjohnstn@redhat.com>2009-05-13 22:28:49 +0400
commiteba36c51fa066f1a8abdc41c42b9f5310d181a12 (patch)
tree13ff297c715a20e246939569ab32ceed04e5f87c /newlib/libc/machine
parent40c66067fb5eef002be164b35aa3637403fc1e48 (diff)
2009-05-13 Paul Brook <paul@codesourcery.com>
* libc/machine/arm/setjmp.S: Add ARMv6-M implementation.
Diffstat (limited to 'newlib/libc/machine')
-rw-r--r--newlib/libc/machine/arm/setjmp.S51
1 files changed, 50 insertions, 1 deletions
diff --git a/newlib/libc/machine/arm/setjmp.S b/newlib/libc/machine/arm/setjmp.S
index 4bb2a46a7..2181a1874 100644
--- a/newlib/libc/machine/arm/setjmp.S
+++ b/newlib/libc/machine/arm/setjmp.S
@@ -55,6 +55,55 @@
For Thumb-2 do everything in Thumb mode. */
+#if defined(__ARM_ARCH_6M__)
+/* ARMv6-M has to be implemented in Thumb mode. */
+
+.thumb
+.thumb_func
+ .globl SYM (setjmp)
+ TYPE (setjmp)
+SYM (setjmp):
+ /* Save registers in jump buffer. */
+ stmia r0!, {r4, r5, r6, r7}
+ mov r1, r8
+ mov r2, r9
+ mov r3, r10
+ mov r4, fp
+ mov r5, sp
+ mov r6, lr
+ stmia r0!, {r1, r2, r3, r4, r5, r6}
+ sub r0, r0, #40
+ /* Restore callee-saved low regs. */
+ ldmia r0!, {r4, r5, r6, r7}
+ /* Return zero. */
+ mov r0, #0
+ bx lr
+
+.thumb_func
+ .globl SYM (longjmp)
+ TYPE (longjmp)
+SYM (longjmp):
+ /* Restore High regs. */
+ add r0, r0, #16
+ ldmia r0!, {r2, r3, r4, r5, r6}
+ mov r8, r2
+ mov r9, r3
+ mov r10, r4
+ mov fp, r5
+ mov sp, r6
+ ldmia r0!, {r3} /* lr */
+ /* Restore low regs. */
+ sub r0, r0, #40
+ ldmia r0!, {r4, r5, r6, r7}
+ /* Return the result argument, or 1 if it is zero. */
+ mov r0, r1
+ bne 1f
+ mov r0, #1
+1:
+ bx r3
+
+#else
+
#ifdef __APCS_26__
#define RET movs pc, lr
#elif defined(__thumb2__)
@@ -169,4 +218,4 @@ SYM (\name):
moveq a1, #1
FUNC_END longjmp
-
+#endif