Skip to content

Commit 086dcab

Browse files
committed
py/nlrriscv32: Add floating-point support.
This should work, but for now it has only been compile-tested
1 parent 665f101 commit 086dcab

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

py/nlr.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,15 @@
7676
#define MICROPY_NLR_NUM_REGS (128)
7777
#elif defined(__riscv_xlen) && __riscv_xlen == 32
7878
#define MICROPY_NLR_RISCV32 (1)
79+
#ifndef __riscv_flen
7980
#define MICROPY_NLR_NUM_REGS (14)
81+
#elif __riscv_flen == 32
82+
#define MICROPY_NLR_NUM_REGS (14 + 12)
83+
#elif __riscv_flen == 64
84+
#define MICROPY_NLR_NUM_REGS (14 + 24)
85+
#else
86+
#error Unimplemented __riscv_flen
87+
#endif
8088
#else
8189
#define MICROPY_NLR_SETJMP (1)
8290
//#warning "No native NLR support for this arch, using setjmp implementation"

py/nlrriscv32.c

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#undef nlr_push
3232

3333
// For reference, riscv callee save regs are:
34-
// s0-s11, ra and sp
34+
// s0-s11, ra, sp and fs0-fs11
3535

3636
#if __has_attribute(__naked__)
3737
__attribute__((__naked__))
@@ -53,6 +53,34 @@ unsigned int nlr_push(nlr_buf_t *nlr) {
5353
"sw s11, 44+%0 \n" // store s11 into nlr->regs
5454
"sw ra, 48+%0 \n" // store ra into nlr->regs
5555
"sw sp, 52+%0 \n" // store sp into nlr->regs
56+
#ifndef __riscv_flen
57+
#elif __riscv_flen == 32
58+
"fsw fs0, 56+%0 \n" // store fs0 into nlr->regs
59+
"fsw fs1, 60+%0 \n" // store fs1 into nlr->regs
60+
"fsw fs2, 64+%0 \n" // store fs2 into nlr->regs
61+
"fsw fs3, 68+%0 \n" // store fs3 into nlr->regs
62+
"fsw fs4, 72+%0 \n" // store fs4 into nlr->regs
63+
"fsw fs5, 76+%0 \n" // store fs5 into nlr->regs
64+
"fsw fs6, 80+%0 \n" // store fs6 into nlr->regs
65+
"fsw fs7, 84+%0 \n" // store fs7 into nlr->regs
66+
"fsw fs8, 88+%0 \n" // store fs8 into nlr->regs
67+
"fsw fs9, 92+%0 \n" // store fs9 into nlr->regs
68+
"fsw fs10, 96+%0 \n" // store fs10 into nlr->regs
69+
"fsw fs11, 100+%0 \n" // store fs11 into nlr->regs
70+
#elif __riscv_flen == 64
71+
"fsd fs0, 56+%0 \n" // store fs0 into nlr->regs
72+
"fsd fs1, 64+%0 \n" // store fs1 into nlr->regs
73+
"fsd fs2, 72+%0 \n" // store fs2 into nlr->regs
74+
"fsd fs3, 80+%0 \n" // store fs3 into nlr->regs
75+
"fsd fs4, 88+%0 \n" // store fs4 into nlr->regs
76+
"fsd fs5, 96+%0 \n" // store fs5 into nlr->regs
77+
"fsd fs6, 104+%0 \n" // store fs6 into nlr->regs
78+
"fsd fs7, 112+%0 \n" // store fs7 into nlr->regs
79+
"fsd fs8, 120+%0 \n" // store fs8 into nlr->regs
80+
"fsd fs9, 128+%0 \n" // store fs9 into nlr->regs
81+
"fsd fs10, 136+%0 \n" // store fs10 into nlr->regs
82+
"fsd fs11, 144+%0 \n" // store fs11 into nlr->regs
83+
#endif
5684
#if __has_attribute(__naked__)
5785
"tail nlr_push_tail \n" // do the rest in C
5886
#endif
@@ -86,6 +114,34 @@ NORETURN void nlr_jump(void *val) {
86114
"lw s10, 40+%0 \n" // load s10 from top->regs
87115
"lw s11, 44+%0 \n" // load s11 from top->regs
88116
"lw ra, 48+%0 \n" // load ra from top->regs
117+
#ifndef __riscv_flen
118+
#elif __riscv_flen == 32
119+
"flw fs0, 56+%0 \n" // load fs0 from top->regs
120+
"flw fs1, 60+%0 \n" // load fs1 from top->regs
121+
"flw fs2, 64+%0 \n" // load fs2 from top->regs
122+
"flw fs3, 68+%0 \n" // load fs3 from top->regs
123+
"flw fs4, 72+%0 \n" // load fs4 from top->regs
124+
"flw fs5, 76+%0 \n" // load fs5 from top->regs
125+
"flw fs6, 80+%0 \n" // load fs6 from top->regs
126+
"flw fs7, 84+%0 \n" // load fs7 from top->regs
127+
"flw fs8, 88+%0 \n" // load fs8 from top->regs
128+
"flw fs9, 92+%0 \n" // load fs9 from top->regs
129+
"flw fs10, 96+%0 \n" // load fs10 from top->regs
130+
"flw fs11, 100+%0 \n" // load fs11 from top->regs
131+
#elif __riscv_flen == 64
132+
"fld fs0, 56+%0 \n" // load fs0 from top->regs
133+
"fld fs1, 64+%0 \n" // load fs1 from top->regs
134+
"fld fs2, 72+%0 \n" // load fs2 from top->regs
135+
"fld fs3, 80+%0 \n" // load fs3 from top->regs
136+
"fld fs4, 88+%0 \n" // load fs4 from top->regs
137+
"fld fs5, 96+%0 \n" // load fs5 from top->regs
138+
"fld fs6, 104+%0 \n" // load fs6 from top->regs
139+
"fld fs7, 112+%0 \n" // load fs7 from top->regs
140+
"fld fs8, 120+%0 \n" // load fs8 from top->regs
141+
"fld fs9, 128+%0 \n" // load fs9 from top->regs
142+
"fld fs10, 136+%0 \n" // load fs10 from top->regs
143+
"fld fs11, 144+%0 \n" // load fs11 from top->regs
144+
#endif
89145
"lw sp, 52+%0 \n" // load sp from top->regs
90146
"li a0, 1 \n" // return 1, non-local return
91147
"ret \n" // return

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy