diff options
Diffstat (limited to 'lib/loongarch64/setjmp.S')
-rw-r--r-- | lib/loongarch64/setjmp.S | 68 |
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 |