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:
Diffstat (limited to 'newlib/libc/machine/msp430/setjmp.S')
-rw-r--r--newlib/libc/machine/msp430/setjmp.S105
1 files changed, 105 insertions, 0 deletions
diff --git a/newlib/libc/machine/msp430/setjmp.S b/newlib/libc/machine/msp430/setjmp.S
new file mode 100644
index 000000000..6684f8acb
--- /dev/null
+++ b/newlib/libc/machine/msp430/setjmp.S
@@ -0,0 +1,105 @@
+/* Copyright (c) 2013 Red Hat, Inc. All rights reserved.
+
+ This copyrighted material is made available to anyone wishing to use,
+ modify, copy, or redistribute it subject to the terms and conditions
+ of the BSD License. This program is distributed in the hope that
+ it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
+ including the implied warranties of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. A copy of this license is available at
+ http://www.opensource.org/licenses. Any Red Hat trademarks that are
+ incorporated in the source code or documentation are not subject to
+ the BSD License and may only be used or replicated with the express
+ permission of Red Hat, Inc.
+*/
+
+# setjmp/longjmp for msp430. The jmpbuf looks like this:
+#
+# Register Jmpbuf offset
+# small large
+# r0 (pc) 0x00 0x00
+# r1 (sp) 0x02 0x04
+# r4 0x04 0x08
+# r5 0x06 0x0c
+# r6 0x08 0x10
+# r7 0x0a 0x14
+# r8 0x0c 0x18
+# r9 0x0e 0x1c
+# r10 0x10 0x20
+
+ .text
+ .global setjmp
+setjmp:
+ ; Upon entry r12 points to the jump buffer.
+ ; Returns 0 to caller.
+
+#if defined __MSP430X_LARGE__
+ mova @r1, r13
+ mova r13, 0(r12)
+ mova r1, 4(r12)
+ mova r4, 8(r12)
+ mova r5, 12(r12)
+ mova r6, 16(r12)
+ mova r7, 20(r12)
+ mova r8, 24(r12)
+ mova r9, 28(r12)
+ mova r10, 32(r12)
+ clr r12
+ reta
+#else
+ ;; Get the return address off the stack
+ mov.w @r1, r13
+ mov.w r13, 0(r12)
+ mov.w r1, 2(r12)
+ mov.w r4, 4(r12)
+ mov.w r5, 6(r12)
+ mov.w r6, 8(r12)
+ mov.w r7, 10(r12)
+ mov.w r8, 12(r12)
+ mov.w r9, 14(r12)
+ mov.w r10, 16(r12)
+ clr r12
+ ret
+#endif
+
+
+ .global longjmp
+longjmp:
+ ; Upon entry r12 points to the jump buffer and
+ ; r13 contains the value to be returned by setjmp.
+
+#if defined __MSP430X_LARGE__
+ mova @r12+, r14
+ mova @r12+, r1
+ mova @r12+, r4
+ mova @r12+, r5
+ mova @r12+, r6
+ mova @r12+, r7
+ mova @r12+, r8
+ mova @r12+, r9
+ mova @r12+, r10
+#else
+ mov.w @r12+, r14
+ mov.w @r12+, r1
+ mov.w @r12+, r4
+ mov.w @r12+, r5
+ mov.w @r12+, r6
+ mov.w @r12+, r7
+ mov.w @r12+, r8
+ mov.w @r12+, r9
+ mov.w @r12+, r10
+#endif
+ ; If caller attempts to return 0, return 1 instead.
+ cmp.w #0, r13
+ jne .Lnot_zero
+ mov.w #1, r13
+.Lnot_zero:
+ mov.w r13, r12
+
+#if defined __MSP430X_LARGE__
+ adda #4, r1
+ mova r14, r0
+#else
+ add.w #2, r1
+ mov.w r14, r0
+#endif
+