OSDN Git Service

Replace FSF snail mail address with URLs
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / sh64 / __longjmp.S
1 /* __longjmp for SH-5.
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    see <http://www.gnu.org/licenses/>.  */
18
19
20 #define _SETJMP_H
21 #define _ASM
22 #include <bits/setjmp.h>
23
24
25 #define INTEGER(reg,offset)     ld.q    r2, offset*8, reg
26 #define DOUBLE(reg,offset)      fld.d   r2, offset*8, reg
27
28
29         .file   "__longjmp.S"
30
31         .section .text64,"xa"
32         .align 2
33
34         .global __longjmp       
35         .type   __longjmp,@function
36
37 __longjmp:
38         /*
39          *      extern void __longjmp(jmp_buf env, int val);
40          *
41          *      r2 == env
42          *      r3 == val
43          *      r4 == temporary
44          */
45
46                         /* callee-save registers R10-R16 */
47         INTEGER(r10, __SETJMP_INT(0))
48         INTEGER(r11, __SETJMP_INT(1))
49         INTEGER(r12, __SETJMP_INT(2))
50         INTEGER(r13, __SETJMP_INT(3))
51         INTEGER(r14, __SETJMP_INT(4))
52         INTEGER(r15, __SETJMP_INT(5))
53         INTEGER(r16, __SETJMP_INT(6))
54
55                         /* callee-save registers R28-R35 */
56         INTEGER(r28, __SETJMP_INT(7))
57         INTEGER(r29, __SETJMP_INT(8))
58         INTEGER(r30, __SETJMP_INT(9))
59         INTEGER(r31, __SETJMP_INT(10))
60         INTEGER(r32, __SETJMP_INT(11))
61         INTEGER(r33, __SETJMP_INT(12))
62         INTEGER(r34, __SETJMP_INT(13))
63         INTEGER(r35, __SETJMP_INT(14))
64
65                         /* callee-save registers R44-R59 */
66         INTEGER(r44, __SETJMP_INT(15))
67         INTEGER(r45, __SETJMP_INT(16))
68         INTEGER(r46, __SETJMP_INT(17))
69         INTEGER(r47, __SETJMP_INT(18))
70         INTEGER(r48, __SETJMP_INT(19))
71         INTEGER(r49, __SETJMP_INT(20))
72         INTEGER(r50, __SETJMP_INT(21))
73         INTEGER(r51, __SETJMP_INT(22))
74         INTEGER(r52, __SETJMP_INT(23))
75         INTEGER(r53, __SETJMP_INT(24))
76         INTEGER(r54, __SETJMP_INT(25))
77         INTEGER(r55, __SETJMP_INT(26))
78         INTEGER(r56, __SETJMP_INT(27))
79         INTEGER(r57, __SETJMP_INT(28))
80         INTEGER(r58, __SETJMP_INT(29))
81         INTEGER(r59, __SETJMP_INT(30))
82
83         #if __SETJMP_NUM_INT != 31
84         #error  __SETJMP_NUM_INT does agree with expected value
85         #endif
86
87 #if __SETJMP_NUM_DBL > 0
88                         /* callee-save registers FR12-FR15 */
89         DOUBLE(d12, __SETJMP_DBL(0))
90         DOUBLE(d14, __SETJMP_DBL(1))
91
92                         /* callee-save registers FR36-FR63 */
93         DOUBLE(d36, __SETJMP_DBL(2))
94         DOUBLE(d38, __SETJMP_DBL(3))
95         DOUBLE(d40, __SETJMP_DBL(4))
96         DOUBLE(d42, __SETJMP_DBL(5))
97         DOUBLE(d44, __SETJMP_DBL(6))
98         DOUBLE(d46, __SETJMP_DBL(7))
99         DOUBLE(d48, __SETJMP_DBL(8))
100         DOUBLE(d50, __SETJMP_DBL(9))
101         DOUBLE(d52, __SETJMP_DBL(10))
102         DOUBLE(d54, __SETJMP_DBL(11))
103         DOUBLE(d56, __SETJMP_DBL(12))
104         DOUBLE(d58, __SETJMP_DBL(13))
105         DOUBLE(d60, __SETJMP_DBL(14))
106         DOUBLE(d62, __SETJMP_DBL(15))
107
108         #if __SETJMP_NUM_DBL != 16
109         #error  __SETJMP_NUM_DBL does agree with expected value
110         #endif
111
112 #endif  /* __SETJMP_NUM_DBL > 0 */
113
114                         /* callee-save registers TR5-TR7 */
115         INTEGER(r4, __SETJMP_TRG(0))
116         ptabs   r4, tr5
117         INTEGER(r4, __SETJMP_TRG(1))
118         ptabs   r4, tr6
119         INTEGER(r4, __SETJMP_TRG(2))
120         ptabs   r4, tr7
121
122         #if __SETJMP_NUM_TRG != 3
123         #error  __SETJMP_NUM_TRG does agree with expected value
124         #endif
125
126                         /* restore Linkage Register (LR) for __longjmp return */
127         INTEGER(r18, __SETJMP_LR)
128         ptabs/l r18, tr0
129
130                         /*
131                          *      must ensure __longjmp() never returns 0.
132                          *      if 'val' == 0, then return 1.
133                          */
134         cmpeq   r3, r63, r2     /* r2 = (r3==0) ? 1 : 0; */
135         add.l   r3, r2, r2      /* return value */
136
137                         /* return to caller */
138         blink   tr0, r63
139
140 libc_hidden_def(__longjmp)