1/* Copyright (c) 2017  SiFive Inc. All rights reserved.
2
3   This copyrighted material is made available to anyone wishing to use,
4   modify, copy, or redistribute it subject to the terms and conditions
5   of the FreeBSD License.   This program is distributed in the hope that
6   it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
7   including the implied warranties of MERCHANTABILITY or FITNESS FOR
8   A PARTICULAR PURPOSE.  A copy of this license is available at
9   http://www.opensource.org/licenses.
10*/
11
12#include <sys/asm.h>
13
14/* int setjmp (jmp_buf);  */
15  .section .text.setjmp
16  .globl  setjmp
17  .type   setjmp, @function
18setjmp:
19	REG_S ra,  0*SZREG(a0)
20	REG_S s0,  1*SZREG(a0)
21	REG_S s1,  2*SZREG(a0)
22
23#ifndef __riscv_32e
24	REG_S s2,  3*SZREG(a0)
25	REG_S s3,  4*SZREG(a0)
26	REG_S s4,  5*SZREG(a0)
27	REG_S s5,  6*SZREG(a0)
28	REG_S s6,  7*SZREG(a0)
29	REG_S s7,  8*SZREG(a0)
30	REG_S s8,  9*SZREG(a0)
31	REG_S s9, 10*SZREG(a0)
32	REG_S s10,11*SZREG(a0)
33	REG_S s11,12*SZREG(a0)
34	REG_S sp, 13*SZREG(a0)
35#else
36	REG_S sp, 3*SZREG(a0)
37#endif
38
39#ifndef __riscv_float_abi_soft
40	FREG_S fs0, 14*SZREG+ 0*SZFREG(a0)
41	FREG_S fs1, 14*SZREG+ 1*SZFREG(a0)
42	FREG_S fs2, 14*SZREG+ 2*SZFREG(a0)
43	FREG_S fs3, 14*SZREG+ 3*SZFREG(a0)
44	FREG_S fs4, 14*SZREG+ 4*SZFREG(a0)
45	FREG_S fs5, 14*SZREG+ 5*SZFREG(a0)
46	FREG_S fs6, 14*SZREG+ 6*SZFREG(a0)
47	FREG_S fs7, 14*SZREG+ 7*SZFREG(a0)
48	FREG_S fs8, 14*SZREG+ 8*SZFREG(a0)
49	FREG_S fs9, 14*SZREG+ 9*SZFREG(a0)
50	FREG_S fs10,14*SZREG+10*SZFREG(a0)
51	FREG_S fs11,14*SZREG+11*SZFREG(a0)
52#endif
53
54	li    a0, 0
55	ret
56	.size	setjmp, .-setjmp
57
58/* volatile void longjmp (jmp_buf, int);  */
59  .section .text.longjmp
60  .globl  longjmp
61  .type   longjmp, @function
62longjmp:
63	REG_L ra,  0*SZREG(a0)
64	REG_L s0,  1*SZREG(a0)
65	REG_L s1,  2*SZREG(a0)
66#ifndef __riscv_32e
67	REG_L s2,  3*SZREG(a0)
68	REG_L s3,  4*SZREG(a0)
69	REG_L s4,  5*SZREG(a0)
70	REG_L s5,  6*SZREG(a0)
71	REG_L s6,  7*SZREG(a0)
72	REG_L s7,  8*SZREG(a0)
73	REG_L s8,  9*SZREG(a0)
74	REG_L s9, 10*SZREG(a0)
75	REG_L s10,11*SZREG(a0)
76	REG_L s11,12*SZREG(a0)
77	REG_L sp, 13*SZREG(a0)
78#else
79	REG_L sp, 3*SZREG(a0)
80#endif
81
82#ifndef __riscv_float_abi_soft
83	FREG_L fs0, 14*SZREG+ 0*SZFREG(a0)
84	FREG_L fs1, 14*SZREG+ 1*SZFREG(a0)
85	FREG_L fs2, 14*SZREG+ 2*SZFREG(a0)
86	FREG_L fs3, 14*SZREG+ 3*SZFREG(a0)
87	FREG_L fs4, 14*SZREG+ 4*SZFREG(a0)
88	FREG_L fs5, 14*SZREG+ 5*SZFREG(a0)
89	FREG_L fs6, 14*SZREG+ 6*SZFREG(a0)
90	FREG_L fs7, 14*SZREG+ 7*SZFREG(a0)
91	FREG_L fs8, 14*SZREG+ 8*SZFREG(a0)
92	FREG_L fs9, 14*SZREG+ 9*SZFREG(a0)
93	FREG_L fs10,14*SZREG+10*SZFREG(a0)
94	FREG_L fs11,14*SZREG+11*SZFREG(a0)
95#endif
96
97	seqz a0, a1
98	add  a0, a0, a1   # a0 = (a1 == 0) ? 1 : a1
99	ret
100	.size	longjmp, .-longjmp
101