8000 py/nlrriscv32: Add floating-point support. · micropython/micropython@b2d8092 · GitHub
[go: up one dir, main page]

Skip to content

Commit b2d8092

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

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" 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
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)
0