2 Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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.
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.
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/>. */
22 #include <bits/setjmp.h>
25 #define INTEGER(reg,offset) ld.q r2, offset*8, reg
26 #define DOUBLE(reg,offset) fld.d r2, offset*8, reg
35 .type __longjmp,@function
39 * extern void __longjmp(jmp_buf env, int val);
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))
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))
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))
83 #if __SETJMP_NUM_INT != 31
84 #error __SETJMP_NUM_INT does agree with expected value
87 #if __SETJMP_NUM_DBL > 0
88 /* callee-save registers FR12-FR15 */
89 DOUBLE(d12, __SETJMP_DBL(0))
90 DOUBLE(d14, __SETJMP_DBL(1))
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))
108 #if __SETJMP_NUM_DBL != 16
109 #error __SETJMP_NUM_DBL does agree with expected value
112 #endif /* __SETJMP_NUM_DBL > 0 */
114 /* callee-save registers TR5-TR7 */
115 INTEGER(r4, __SETJMP_TRG(0))
117 INTEGER(r4, __SETJMP_TRG(1))
119 INTEGER(r4, __SETJMP_TRG(2))
122 #if __SETJMP_NUM_TRG != 3
123 #error __SETJMP_NUM_TRG does agree with expected value
126 /* restore Linkage Register (LR) for __longjmp return */
127 INTEGER(r18, __SETJMP_LR)
131 * must ensure __longjmp() never returns 0.
132 * if 'val' == 0, then return 1.
134 cmpeq r3, r63, r2 /* r2 = (r3==0) ? 1 : 0; */
135 add.l r3, r2, r2 /* return value */
137 /* return to caller */
140 libc_hidden_def(__longjmp)