Update __longjmp.S
[uclibc-ng.git] / libc / sysdeps / linux / or1k / __longjmp.S
blobe49455fb1138a057e11d013100748f4a3e1557ed
1 /* longjmp for or1k
3    Based on:
4    longjmp for PowerPC.
5    Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
6    This file is part of the GNU C Library.
8    The GNU C Library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Lesser General Public
10    License as published by the Free Software Foundation; either
11    version 2.1 of the License, or (at your option) any later version.
13    The GNU C Library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
18    You should have received a copy of the GNU Lesser General Public
19    License along with the GNU C Library; see the file COPYING.LIB.  If
20    not, see <http://www.gnu.org/licenses/>.  */
22 #include <jmpbuf-offsets.h>
24 #ifdef __UCLIBC_HAS_FLOATS__
25 #define FP(x...) x
26 #else
27 #define FP(x...)
28 #endif
30 .globl     __longjmp;
31 .type      __longjmp,@function;
32 .align     4;
34 __longjmp:    
35 #       l.lwz   r11,(JB_SR*4)(r3)
36 #       l.mtspr r0,r11,SPR_SR
37         l.lwz   r1,((JB_GPRS+0)*4)(r3)
38         l.lwz   r2,((JB_GPRS+1)*4)(r3)
39         /* pass through "value" to r11, then restore r4, for what it's worth" */
40 #if 1   
41         /* if r4 is 0, something wrong, so set it to 1 */
42         l.sfeqi r4, 0x0
43         l.bnf   1f /* r4 != 0, longjmp value sensible */
44         l.nop
45         l.ori   r4, r0, 0x1 /* make nonzero */
47 #endif  
48         l.addi  r11, r4, 0
49         l.lwz   r4,((JB_GPRS+3)*4)(r3)
50         l.lwz   r5,((JB_GPRS+4)*4)(r3)
51         l.lwz   r6,((JB_GPRS+5)*4)(r3)
52         l.lwz   r7,((JB_GPRS+6)*4)(r3)
53         l.lwz   r8,((JB_GPRS+7)*4)(r3)
54         l.lwz   r9,((JB_GPRS+8)*4)(r3)
55         l.lwz   r10,((JB_GPRS+9)*4)(r3)
56         l.lwz   r12,((JB_GPRS+11)*4)(r3)
57         l.lwz   r13,((JB_GPRS+12)*4)(r3)
58         l.lwz   r14,((JB_GPRS+13)*4)(r3)
59         l.lwz   r15,((JB_GPRS+14)*4)(r3)
60         l.lwz   r16,((JB_GPRS+15)*4)(r3)
61         l.lwz   r17,((JB_GPRS+16)*4)(r3)
62         l.lwz   r18,((JB_GPRS+17)*4)(r3)
63         l.lwz   r19,((JB_GPRS+18)*4)(r3)
64         l.lwz   r20,((JB_GPRS+19)*4)(r3)
65         l.lwz   r21,((JB_GPRS+20)*4)(r3)
66         l.lwz   r22,((JB_GPRS+21)*4)(r3)
67         l.lwz   r23,((JB_GPRS+22)*4)(r3)
68         l.lwz   r24,((JB_GPRS+23)*4)(r3)
69         l.lwz   r25,((JB_GPRS+24)*4)(r3)
70         l.lwz   r26,((JB_GPRS+25)*4)(r3)
71         l.lwz   r27,((JB_GPRS+26)*4)(r3)
72         l.lwz   r28,((JB_GPRS+27)*4)(r3)
73         l.lwz   r29,((JB_GPRS+28)*4)(r3)
74         l.lwz   r30,((JB_GPRS+29)*4)(r3)
75         l.lwz   r31,((JB_GPRS+30)*4)(r3)
76         l.jr    r9
77         l.nop
78 .size     __longjmp,.-__longjmp
80 libc_hidden_def(__longjmp)