OSDN Git Service

Replace FSF snail mail address with URLs
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / arm / setjmp.S
1 /* setjmp for ARM.
2    Copyright (C) 1997, 1998 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <features.h>
20 #include <bits/arm_asm.h>
21
22 .global __sigsetjmp
23 .type __sigsetjmp,%function
24 .align 2
25 #if defined(THUMB1_ONLY)
26 .thumb_func
27 __sigsetjmp:
28         push    {r3, r4, r5, r6, r7, lr}
29         mov     ip, r0
30         stmia   r0!, {r4, r5, r6, r7}
31         mov     r2, r8
32         mov     r3, r9
33         mov     r4, sl
34         mov     r5, fp
35         add     r6, sp, #(6 * 4)
36         mov     r7, lr
37         stmia   r0!, {r2, r3, r4, r5, r6, r7}
38
39         mov     r0, ip
40         bl      __sigjmp_save
41         pop     {r3, r4, r5, r6, r7, pc}
42
43 #else
44 __sigsetjmp:
45         /* Save registers */
46         mov     ip, r0
47 #if defined(__thumb2__)
48         stmia   ip!, {v1-v6, sl, fp}
49         mov     r2, sp
50         stmia   ip!, {r2, lr}
51 #else
52         /* Save registers */
53         stmia   ip!, {v1-v6, sl, fp, sp, lr}
54 #endif
55 #if defined __UCLIBC_HAS_FLOATS__ && ! defined __UCLIBC_HAS_SOFT_FLOAT__
56 # ifdef __VFP_FP__
57         /* Store the VFP registers.  */
58         /* Following instruction is fstmiax ip!, {d8-d15}.  */
59         stc     p11, cr8, [r12], #68
60         /* Store the floating-point status register.  */
61         /* Following instruction is fmrx r2, fpscr.  */
62         mrc     p10, 7, r2, cr1, cr0, 0
63         str     r2, [ip], #4
64 # elif defined __MAVERICK__
65         cfstrd  mvd4,  [ip], #8 ; nop
66         cfstrd  mvd5,  [ip], #8 ; nop
67         cfstrd  mvd6,  [ip], #8 ; nop
68         cfstrd  mvd7,  [ip], #8 ; nop
69         cfstrd  mvd8,  [ip], #8 ; nop
70         cfstrd  mvd9,  [ip], #8 ; nop
71         cfstrd  mvd10, [ip], #8 ; nop
72         cfstrd  mvd11, [ip], #8 ; nop
73         cfstrd  mvd12, [ip], #8 ; nop
74         cfstrd  mvd13, [ip], #8 ; nop
75         cfstrd  mvd14, [ip], #8 ; nop
76         cfstrd  mvd15, [ip], #8
77 # else
78         sfmea   f4, 4, [ip]!
79 # endif
80 #endif
81 #ifdef __IWMMXT__
82         /* Save the call-preserved iWMMXt registers.  */
83         /* Following instructions are wstrd wr10, [ip], #8 (etc.)  */
84         stcl    p1, cr10, [r12], #8
85         stcl    p1, cr11, [r12], #8
86         stcl    p1, cr12, [r12], #8
87         stcl    p1, cr13, [r12], #8
88         stcl    p1, cr14, [r12], #8
89         stcl    p1, cr15, [r12], #8
90 #endif
91
92         /* Make a tail call to __sigjmp_save; it takes the same args.  */
93 #ifdef __PIC__
94         B       __sigjmp_save(PLT)
95 #else
96         B       __sigjmp_save
97 #endif
98 #endif
99
100 .size __sigsetjmp,.-__sigsetjmp