Qucs-S S-parameter Viewer & RF Synthesis Tools
Loading...
Searching...
No Matches
switch_riscv_unix.h
1#define STACK_REFPLUS 1
2
3#ifdef SLP_EVAL
4#define STACK_MAGIC 0
5
6#define REGS_TO_SAVE "s1", "s2", "s3", "s4", "s5", \
7 "s6", "s7", "s8", "s9", "s10", "s11", "fs0", "fs1", \
8 "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", \
9 "fs10", "fs11"
10
11static int
12slp_switch(void)
13{
14 int ret;
15 long fp;
16 long *stackref, stsizediff;
17
18 __asm__ volatile ("" : : : REGS_TO_SAVE);
19 __asm__ volatile ("mv %0, fp" : "=r" (fp) : );
20 __asm__ volatile ("mv %0, sp" : "=r" (stackref) : );
21 {
22 SLP_SAVE_STATE(stackref, stsizediff);
23 __asm__ volatile (
24 "add sp, sp, %0\n\t"
25 "add fp, fp, %0\n\t"
26 : /* no outputs */
27 : "r" (stsizediff)
28 );
29 SLP_RESTORE_STATE();
30 }
31 __asm__ volatile ("" : : : REGS_TO_SAVE);
32#if __riscv_xlen == 32
33 __asm__ volatile ("lw fp, %0" : : "m" (fp));
34#else
35 __asm__ volatile ("ld fp, %0" : : "m" (fp));
36#endif
37 __asm__ volatile ("mv %0, zero" : "=r" (ret) : );
38 return ret;
39}
40
41#endif