Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / machine / msp430 / setjmp.S
blobf3deefae52fcfa620563caac4b1e6df3ca626a8f
1 /* Copyright (c) 2013  Red Hat, Inc. All rights reserved.
3    This copyrighted material is made available to anyone wishing to use,
4    modify, copy, or redistribute it subject to the terms and conditions
5    of the BSD License.   This program is distributed in the hope that
6    it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
7    including the implied warranties of MERCHANTABILITY or FITNESS FOR
8    A PARTICULAR PURPOSE.  A copy of this license is available at
9    http://www.opensource.org/licenses. Any Red Hat trademarks that are
10    incorporated in the source code or documentation are not subject to
11    the BSD License and may only be used or replicated with the express
12    permission of Red Hat, Inc.
15 # setjmp/longjmp for msp430.  The jmpbuf looks like this:
17 # Register      Jmpbuf offset
18 #               small   large   
19 # r0 (pc)       0x00     0x00
20 # r1 (sp)       0x02     0x04   
21 # r4            0x04     0x08
22 # r5            0x06     0x0c
23 # r6            0x08     0x10
24 # r7            0x0a     0x14
25 # r8            0x0c     0x18
26 # r9            0x0e     0x1c
27 # r10           0x10     0x20
29         .text
30         .global setjmp
31 setjmp:
32         ; Upon entry r12 points to the jump buffer.
33         ; Returns 0 to caller.
34         
35 #if   defined __MSP430X_LARGE__
36         mova   @r1, r13
37         mova    r13, 0(r12)
38         mova    r1,  4(r12)
39         mova    r4,  8(r12)
40         mova    r5,  12(r12)
41         mova    r6,  16(r12)
42         mova    r7,  20(r12)
43         mova    r8,  24(r12)
44         mova    r9,  28(r12)
45         mova    r10, 32(r12)
46         clr     r12
47         reta
48 #else
49         ;; Get the return address off the stack
50         mov.w  @r1,  r13
51         mov.w   r13, 0(r12)
52         mov.w   r1,  2(r12)
53         mov.w   r4,  4(r12)
54         mov.w   r5,  6(r12)
55         mov.w   r6,  8(r12)
56         mov.w   r7,  10(r12)
57         mov.w   r8,  12(r12)
58         mov.w   r9,  14(r12)
59         mov.w   r10, 16(r12)
60         clr     r12
61         ret
62 #endif  
63         .size setjmp , . - setjmp
65         
66         .global longjmp
67 longjmp:
68         ; Upon entry r12 points to the jump buffer and
69         ; r13 contains the value to be returned by setjmp.
71 #if   defined __MSP430X_LARGE__
72         mova    @r12+, r14
73         mova    @r12+, r1
74         mova    @r12+, r4
75         mova    @r12+, r5
76         mova    @r12+, r6
77         mova    @r12+, r7
78         mova    @r12+, r8
79         mova    @r12+, r9
80         mova    @r12+, r10
81 #else
82         mov.w   @r12+, r14
83         mov.w   @r12+, r1
84         mov.w   @r12+, r4
85         mov.w   @r12+, r5
86         mov.w   @r12+, r6
87         mov.w   @r12+, r7
88         mov.w   @r12+, r8
89         mov.w   @r12+, r9
90         mov.w   @r12+, r10
91 #endif
92         ; If caller attempts to return 0, return 1 instead.
93         cmp.w   #0, r13
94         jne     .Lnot_zero
95         mov.w   #1, r13
96 .Lnot_zero:
97         mov.w   r13, r12
99 #if   defined __MSP430X_LARGE__
100         adda     #4, r1
101         mova    r14, r0
102 #else
103         add.w    #2, r1
104         mov.w   r14, r0
105 #endif
106         .size longjmp , . - longjmp