1 /* $NetBSD: setjmp.S,v 1.1.1.1 2021/09/30 18:50:09 jmcneill Exp $ */ 2 3 // SPDX-License-Identifier: GPL-2.0+ 4 /* 5 * Copyright Heinrich Schuchardt <xypron.glpk (at) gmx.de> 6 */ 7 8 .text 9 .p2align 3 10 11 #define GREG_LIST \ 12 REG_ONE(s0, 0); \ 13 REG_ONE(s1, 8); \ 14 REG_ONE(s2, 16); \ 15 REG_ONE(s3, 24); \ 16 REG_ONE(s4, 32); \ 17 REG_ONE(s5, 40); \ 18 REG_ONE(s6, 48); \ 19 REG_ONE(s7, 56); \ 20 REG_ONE(s8, 64); \ 21 REG_ONE(s9, 72); \ 22 REG_ONE(s10, 80); \ 23 REG_ONE(s11, 88); \ 24 REG_ONE(sp, 96); \ 25 REG_ONE(ra, 104); 26 27 #define FREG_LIST \ 28 FREG_ONE(fs0, 112); \ 29 FREG_ONE(fs1, 120); \ 30 FREG_ONE(fs2, 128); \ 31 FREG_ONE(fs3, 136); \ 32 FREG_ONE(fs4, 144); \ 33 FREG_ONE(fs5, 152); \ 34 FREG_ONE(fs6, 160); \ 35 FREG_ONE(fs7, 168); \ 36 FREG_ONE(fs8, 176); \ 37 FREG_ONE(fs9, 184); \ 38 FREG_ONE(fs10, 192); \ 39 FREG_ONE(fs11, 200); 40 41 #define REG_ONE(R, P) sd R, P(a0) 42 #define FREG_ONE(R, P) fsd R, P(a0) 43 44 .globl setjmp 45 .type setjmp, @function 46 47 setjmp: 48 GREG_LIST 49 #ifndef __riscv_float_abi_soft 50 FREG_LIST 51 #endif 52 li a0, 0 53 ret 54 55 #undef REG_ONE 56 #undef FREG_ONE 57 58 #define REG_ONE(R, P) ld R, P(a0) 59 #define FREG_ONE(R, P) fld R, P(a0) 60 61 .globl longjmp 62 .type longjmp, @function 63 64 longjmp: 65 GREG_LIST 66 #ifndef __riscv_float_abi_soft 67 FREG_LIST 68 #endif 69 seqz a0, a1 70 add a0, a0, a1 71 ret 72