summaryrefslogtreecommitdiff
path: root/lib/loongarch64/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/loongarch64/setjmp.S')
-rw-r--r--lib/loongarch64/setjmp.S68
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/loongarch64/setjmp.S b/lib/loongarch64/setjmp.S
new file mode 100644
index 0000000..94955ee
--- /dev/null
+++ b/lib/loongarch64/setjmp.S
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+ * Copyright (c) 2021 Loongson Technology Corporation Limited.All rights
+ * reserved.
+ * Author: zhoumingtao <zhoumingtao@loongson.cn>
+ *
+ * This program and the accompanying materials are licensed and made
+ * available
+ * under the terms and conditions of the BSD License which accompanies
+ * this
+ * distribution. The full text of the license may be found at
+ * http://opensource.org/licenses/bsd-license.php.
+ *
+ * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
+ * BASIS,
+ * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED.
+ */
+
+ .text
+ .p2align 3
+
+/*
+ int setjmp(jmp_buf env);
+*/
+ .globl setjmp
+ .type setjmp, @function
+setjmp:
+ st.d $ra, $a0, 0x0
+ st.d $sp, $a0, 0x8
+ st.d $fp, $a0, 0x10
+ st.d $s0, $a0, 0x18
+ st.d $s1, $a0, 0x20
+ st.d $s2, $a0, 0x28
+ st.d $s3, $a0, 0x30
+ st.d $s4, $a0, 0x38
+ st.d $s5, $a0, 0x40
+ st.d $s6, $a0, 0x48
+ st.d $s7, $a0, 0x50
+ st.d $s8, $a0, 0x58
+
+ move $a0, $zero
+ jirl $zero,$ra,0
+
+/*
+ void longjmp(jmp_buf env, int val);
+*/
+ .globl longjmp
+ .type longjmp, @function
+longjmp:
+ ld.d $ra, $a0, 0x0
+ ld.d $sp, $a0, 0x8
+ ld.d $fp, $a0, 0x10
+ ld.d $s0, $a0, 0x18
+ ld.d $s1, $a0, 0x20
+ ld.d $s2, $a0, 0x28
+ ld.d $s3, $a0, 0x30
+ ld.d $s4, $a0, 0x38
+ ld.d $s5, $a0, 0x40
+ ld.d $s6, $a0, 0x48
+ ld.d $s7, $a0, 0x50
+ ld.d $s8, $a0, 0x58
+
+ addi.d $a0, $zero, 1 # a0 = 1
+ beqz $a1, .L0 # if (a1 == 0); goto L0
+ move $a0, $a1 # a0 = a1
+.L0:
+ jirl $zero,$ra,0