31
31
#undef nlr_push
32
32
33
33
// For reference, riscv callee save regs are:
34
- // s0-s11, ra and sp
34
+ // s0-s11, ra, sp and fs0-fs11
35
35
36
36
__attribute__((naked )) unsigned int nlr_push (nlr_buf_t * nlr ) {
37
37
@@ -50,6 +50,34 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
50
50
"sw s11, 44+%0 \n" // store s11 into nlr->regs
51
51
"sw ra, 48+%0 \n" // store ra into nlr->regs
52
52
"sw sp, 52+%0 \n" // store sp into nlr->regs
53
+ #ifndef __riscv_flen
54
+ #elif __riscv_flen == 32
55
+ "fsw fs0, 56+%0 \n" // store fs0 into nlr->regs
56
+ "fsw fs1, 60+%0 \n" // store fs1 into nlr->regs
57
+ "fsw fs2, 64+%0 \n" // store fs2 into nlr->regs
58
+ "fsw fs3, 68+%0 \n" // store fs3 into nlr->regs
59
+ "fsw fs4, 72+%0 \n" // store fs4 into nlr->regs
60
+ "fsw fs5, 76+%0 \n" // store fs5 into nlr->regs
61
+ "fsw fs6, 80+%0 \n" // store fs6 into nlr->regs
62
+ "fsw fs7, 84+%0 \n" // store fs7 into nlr->regs
63
+ "fsw fs8, 88+%0 \n" // store fs8 into nlr->regs
64
+ "fsw fs9, 92+%0 \n" // store fs9 into nlr->regs
65
+ "fsw fs10, 96+%0 \n" // store fs10 into nlr->regs
66
+ "fsw fs11, 100+%0 \n" // store fs11 into nlr->regs
67
+ #elif __riscv_flen == 64
68
+ "fsd fs0, 56+%0 \n" // store fs0 into nlr->regs
69
+ "fsd fs1, 64+%0 \n" // store fs1 into nlr->regs
70
+ "fsd fs2, 72+%0 \n" // store fs2 into nlr->regs
71
+ "fsd fs3, 80+%0 \n" // store fs3 into nlr->regs
72
+ "fsd fs4, 88+%0 \n" // store fs4 into nlr->regs
73
+ "fsd fs5, 96+%0 \n" // store fs5 into nlr->regs
74
+ "fsd fs6, 104+%0 \n" // store fs6 into nlr->regs
75
+ "fsd fs7, 112+%0 \n" // store fs7 into nlr->regs
76
+ "fsd fs8, 120+%0 \n" // store fs8 into nlr->regs
77
+ "fsd fs9, 128+%0 \n" // store fs9 into nlr->regs
78
+ "fsd fs10, 136+%0 \n" // store fs10 into nlr->regs
79
+ "fsd fs11, 144+%0 \n" // store fs11 into nlr->regs
80
+ #endif
53
81
"tail nlr_push_tail \n " // do the rest in C
54
82
: "=o" (nlr -> regs )
55
83
);
@@ -77,6 +105,34 @@ NORETURN void nlr_jump(void *val) {
77
105
"lw s10, 40+%0 \n" // load s10 from top->regs
78
106
"lw s11, 44+%0 \n" // load s11 from top->regs
79
107
"lw ra, 48+%0 \n" // load ra from top->regs
108
+ #ifndef __riscv_flen
109
+ #elif __riscv_flen == 32
110
+ "flw fs0, 56+%0 \n" // load fs0 from top->regs
111
+ "flw fs1, 60+%0 \n" // load fs1 from top->regs
112
+ "flw fs2, 64+%0 \n" // load fs2 from top->regs
113
+ "flw fs3, 68+%0 \n" // load fs3 from top->regs
114
+ "flw fs4, 72+%0 \n" // load fs4 from top->regs
115
+ "flw fs5, 76+%0 \n" // load fs5 from top->regs
116
+ "flw fs6, 80+%0 \n" // load fs6 from top->regs
117
+ "flw fs7, 84+%0 \n" // load fs7 from top->regs
118
+ "flw fs8, 88+%0 \n" // load fs8 from top->regs
119
+ "flw fs9, 92+%0 \n" // load fs9 from top->regs
120
+ "flw fs10, 96+%0 \n" // load fs10 from top->regs
121
+ "flw fs11, 100+%0 \n" // load fs11 from top->regs
122
+ #elif __riscv_flen == 64
123
+ "fld fs0, 56+%0 \n" // load fs0 from top->regs
124
+ "fld fs1, 64+%0 \n" // load fs1 from top->regs
125
+ "fld fs2, 72+%0 \n" // load fs2 from top->regs
126
+ "fld fs3, 80+%0 \n" // load fs3 from top->regs
127
+ "fld fs4, 88+%0 \n"
7753
// load fs4 from top->regs
128
+ "fld fs5, 96+%0 \n" // load fs5 from top->regs
129
+ "fld fs6, 104+%0 \n" // load fs6 from top->regs
130
+ "fld fs7, 112+%0 \n" // load fs7 from top->regs
131
+ "fld fs8, 120+%0 \n" // load fs8 from top->regs
132
+ "fld fs9, 128+%0 \n" // load fs9 from top->regs
133
+ "fld fs10, 136+%0 \n" // load fs10 from top->regs
134
+ "fld fs11, 144+%0 \n" // load fs11 from top->regs
135
+ #endif
80
136
"lw sp, 52+%0 \n" // load sp from top->regs
81
137
"li a0, 1 \n" // return 1, non-local return
82
138
"ret \n" // return
0 commit comments