aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/csky/abiv2/__longjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/csky/abiv2/__longjmp.S')
-rw-r--r--sysdeps/csky/abiv2/__longjmp.S61
1 files changed, 61 insertions, 0 deletions
diff --git a/sysdeps/csky/abiv2/__longjmp.S b/sysdeps/csky/abiv2/__longjmp.S
new file mode 100644
index 0000000000..cef4d830b6
--- /dev/null
+++ b/sysdeps/csky/abiv2/__longjmp.S
@@ -0,0 +1,61 @@
+/* longjmp for C-SKY ABIV2.
+ Copyright (C) 2018 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ENTRY (__longjmp)
+ mov a2, a0
+ mov a0, a1 /* Get the return value in place. */
+ cmpnei a0, 0
+ bt have_return
+ movi a0, 1 /* Can't let setjmp() return zero! */
+have_return:
+#ifdef CHECK_SP
+ ldw r10, (a2, 0) /* Jmpbuf's sp. */
+# ifdef PTR_MANGLE
+ PTR_DEMANGLE (r10, r10, a3)
+# endif
+ CHECK_SP (r10)
+#endif
+ ldw sp, (a2, 0)
+ ldw lr, (a2, 4)
+ ldw r4, (a2, 8)
+ ldw r5, (a2, 12)
+ ldw r6, (a2, 16)
+ ldw r7, (a2, 20)
+ ldw r8, (a2, 24)
+ ldw r9, (a2, 28)
+ ldw r10, (a2, 32)
+ ldw r11, (a2, 36)
+ ldw r16, (a2, 40)
+ ldw r17, (a2, 44)
+ ldw r26, (a2, 48)
+ ldw r27, (a2, 52)
+ ldw r28, (a2, 56)
+ ldw r29, (a2, 60)
+ ldw r30, (a2, 64)
+ ldw r31, (a2, 68)
+ addi a2, 72
+
+#ifdef PTR_MANGLE
+ PTR_DEMANGLE (sp, sp, a3)
+ PTR_DEMANGLE2 (lr, lr, a3)
+#endif
+ jmp lr
+
+END (__longjmp)