OSDN Git Service

bb87ff0fbc299fa46f7fe1f1695ed556918e8d8d
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / sh / setjmp.S
1 /* setjmp for SH3.
2    Copyright (C) 1999, 2000 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 Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    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    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #include <features.h>
21 #define _SETJMP_H
22 #define _ASM
23 #include <bits/setjmp.h>
24
25         .text
26
27 /* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
28    We cannot do it in C because it must be a tail-call, so frame-unwinding
29    in setjmp doesn't clobber the state restored by longjmp.  */
30
31         .align 4
32         .type   _setjmp,@function
33         .globl  _setjmp;
34 _setjmp:
35         bra     __sigsetjmp_intern
36          mov    #0, r1
37         .size _setjmp,.-_setjmp;
38
39 /* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
40    We cannot do it in C because it must be a tail-call, so frame-unwinding
41    in setjmp doesn't clobber the state restored by longjmp.  */
42
43         .align 4
44         .type   setjmp,@function
45         .globl  setjmp;
46 setjmp: 
47         bra     __sigsetjmp_intern
48          mov    #1, r1
49         .size setjmp,.-setjmp;
50         
51         .align 4
52         .type   __sigsetjmp,@function
53         .globl  __sigsetjmp;
54 __sigsetjmp:
55         mov     r0, r1
56         nop             /* align this guy */
57 __sigsetjmp_intern:
58         /* Save registers */
59 #if defined __UCLIBC_HAS_FLOATS__ && ! defined __UCLIBC_HAS_SOFT_FLOAT__
60         add     #(JB_SIZE), r4
61         fmov.s  fr15, @-r4
62         fmov.s  fr14, @-r4
63         fmov.s  fr13, @-r4
64         fmov.s  fr12, @-r4
65         sts.l   fpscr, @-r4
66 #else
67         add     #(JB_SIZE-(5*4)), r4 /* this code doesn't do FP yet */
68 #endif          
69         stc.l   gbr, @-r4
70         sts.l   pr, @-r4
71         mov.l   r15, @-r4
72         mov.l   r14, @-r4
73         mov.l   r13, @-r4
74         mov.l   r12, @-r4
75         mov.l   r11, @-r4
76         mov.l   r10, @-r4
77         mov.l   r9, @-r4
78         mov.l   r8, @-r4
79
80 #if defined __HAVE_ELF__ && defined __HAVE_SHARED__ 
81         mov.l   .LG, r2
82         mova    .LG, r0
83         add     r0, r2
84         /* Make a tail call to __sigjmp_save; it takes the same args.  */
85         mov.l   .L1, r0
86         mov.l   @(r0,r2),r0
87         jmp     @r0
88          mov     r1, r0
89         .align  2
90 .LG:    .long   _GLOBAL_OFFSET_TABLE_
91 .L1:    .long   __sigjmp_save@GOT
92 #else
93         /* Make a tail call to __sigjmp_save; it takes the same args.  */
94         mov.l   .L1, r0
95         braf    r0
96          mov     r1, r0
97 .jmp_loc:               
98         .align  2
99 .L1:    .long   __sigjmp_save - .jmp_loc
100 #endif  
101
102         .size __sigsetjmp,.-__sigsetjmp;