1/* longjmp for C-SKY ABIV2.
2   Copyright (C) 2018-2021 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 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.
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   Lesser General Public License for more details.
14
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   <https://www.gnu.org/licenses/>.  */
18
19#include <sysdep.h>
20
21ENTRY (__longjmp)
22	mov	a2, a0
23	mov	a0, a1		/* Get the return value in place.  */
24	cmpnei	a0, 0
25	bt	have_return
26	movi	a0, 1		/* Can't let setjmp() return zero! */
27have_return:
28#ifdef CHECK_SP
29	ldw	r10, (a2, 0)	/* Jmpbuf's sp.  */
30# ifdef PTR_MANGLE
31	PTR_DEMANGLE (r10, r10, a3)
32# endif
33	CHECK_SP (r10)
34#endif
35	ldw	sp, (a2, 0)
36	ldw	lr, (a2, 4)
37	ldw	r4, (a2, 8)
38	ldw	r5, (a2, 12)
39	ldw	r6, (a2, 16)
40	ldw	r7, (a2, 20)
41	ldw	r8, (a2, 24)
42	ldw	r9, (a2, 28)
43	ldw	r10, (a2, 32)
44	ldw	r11, (a2, 36)
45	ldw	r16, (a2, 40)
46	ldw	r17, (a2, 44)
47	ldw	r26, (a2, 48)
48	ldw	r27, (a2, 52)
49	ldw	r28, (a2, 56)
50	ldw	r29, (a2, 60)
51	ldw	r30, (a2, 64)
52	ldw	r31, (a2, 68)
53	addi	a2, 72
54
55#ifdef PTR_MANGLE
56	PTR_DEMANGLE (sp, sp, a3)
57	PTR_DEMANGLE2 (lr, lr, a3)
58#endif
59	jmp	lr
60
61END (__longjmp)
62