Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / powerpc / powerpc32 / __longjmp-common.S
blob01b892c7812719df328ab0980463eb9ce4a859a4
1 /* longjmp for PowerPC.
2    Copyright (C) 1995-2014 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 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.
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.
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/>.  */
19 #include <sysdep.h>
20 #include <stap-probe.h>
21 #define _ASM
22 #ifdef __NO_VMX__
23 # include <novmxsetjmp.h>
24 #else
25 # include <jmpbuf-offsets.h>
26 #endif
28 #if defined __SPE__ || (defined __NO_FPRS__ && !defined _SOFT_FLOAT)
29 # define LOAD_GP(N)     evldd r##N,((JB_FPRS+((N)-14)*2)*4)(r3)
30 #else
31 # define LOAD_GP(N)     lwz r##N,((JB_GPRS+(N)-14)*4)(r3)
32 #endif
34 ENTRY (__longjmp_symbol)
36 #if defined PTR_DEMANGLE || defined CHECK_SP
37         lwz r24,(JB_GPR1*4)(r3)
38 # ifdef CHECK_SP
39 #  ifdef PTR_DEMANGLE
40         PTR_DEMANGLE3 (r24, r24, r25)
41 #  endif
42         CHECK_SP (r24)
43         mr r1,r24
44 # endif
45 #else
46         lwz r1,(JB_GPR1*4)(r3)
47 #endif
48         lwz r0,(JB_LR*4)(r3)
49         LOAD_GP (14)
50         LOAD_GP (15)
51         LOAD_GP (16)
52         LOAD_GP (17)
53         LOAD_GP (18)
54         LOAD_GP (19)
55         LOAD_GP (20)
56 #ifdef PTR_DEMANGLE
57 # ifndef CHECK_SP
58         PTR_DEMANGLE3 (r1, r24, r25)
59 # endif
60         PTR_DEMANGLE2 (r0, r25)
61 #endif
62         /* longjmp/longjmp_target probe expects longjmp first argument (4@3),
63            second argument (-4@4), and target address (4@0), respectively.  */
64         LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
65         mtlr r0
66         LOAD_GP (21)
67         LOAD_GP (22)
68         lwz r5,(JB_CR*4)(r3)
69         LOAD_GP (23)
70         LOAD_GP (24)
71         LOAD_GP (25)
72         mtcrf 0xFF,r5
73         LOAD_GP (26)
74         LOAD_GP (27)
75         LOAD_GP (28)
76         LOAD_GP (29)
77         LOAD_GP (30)
78         LOAD_GP (31)
79         LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
80         mr r3,r4
81         blr
82 END (__longjmp_symbol)