Skip to content

Commit 2260074

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

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
@@ -78,7 +78,15 @@
7878
#define MICROPY_NLR_NUM_REGS (128)
7979
#elif defined(__riscv_xlen) && __riscv_xlen == 32
8080
#define MICROPY_NLR_RISCV32 (1)
81+
#ifndef __riscv_flen
8182
#define MICROPY_NLR_NUM_REGS (14)
83+
#elif __riscv_flen == 32
84+
#define MICROPY_NLR_NUM_REGS (14 + 12)
85+
#elif __riscv_flen == 64
86+
#define MICROPY_NLR_NUM_REGS (14 + 24)
87+
#else
88+
#error Unimplemented __riscv_flen
89+
#endif
8290
#else
8391
#define MICROPY_NLR_SETJMP (1)
8492
//#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
__attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
3737

@@ -50,6 +50,34 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
5050
"sw s11, 44+%0 \n" // store s11 into nlr->regs
5151
"sw ra, 48+%0 \n" // store ra into nlr->regs
5252
"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
5381
"tail nlr_push_tail \n" // do the rest in C
5482
: "=o" (nlr->regs)
5583
);
@@ -77,6 +105,34 @@ NORETURN void nlr_jump(void *val) {
77105
"lw s10, 40+%0 \n" // load s10 from top->regs
78106
"lw s11, 44+%0 \n" // load s11 from top->regs
79107
"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" // 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
80136
"lw sp, 52+%0 \n" // load sp from top->regs
81137
"li a0, 1 \n" // return 1, non-local return
82138
"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