Skip to content

Commit 767d47d

Browse files
dpgeorgetannewt
authored andcommitted
py/nlrthumb: Save and restore VFP registers s16-s21 when CPU has them.
These s16-s21 registers are used by gcc so need to be saved. Future versions of gcc (beyond v9.1.0), or other compilers, may eventually need additional registers saved/restored. See issue #4844.
1 parent 1cf0ce0 commit 767d47d

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

py/nlr.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,14 @@
5454
#endif
5555
#elif defined(__thumb2__) || defined(__thumb__) || defined(__arm__)
5656
#define MICROPY_NLR_THUMB (1)
57-
#define MICROPY_NLR_NUM_REGS (10)
57+
#if defined(__SOFTFP__)
58+
#define MICROPY_NLR_NUM_REGS (10)
59+
#else
60+
// With hardware FP registers s16-s31 are callee save so in principle
61+
// should be saved and restored by the NLR code. gcc only uses s16-s21
62+
// so only save/restore those as an optimisation.
63+
#define MICROPY_NLR_NUM_REGS (10 + 6)
64+
#endif
5865
#elif defined(__xtensa__)
5966
#define MICROPY_NLR_XTENSA (1)
6067
#define MICROPY_NLR_NUM_REGS (10)

py/nlrthumb.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
6363
"str r10, [r0, #36] \n" // store r10 into nlr_buf
6464
"str r11, [r0, #40] \n" // store r11 into nlr_buf
6565
"str r13, [r0, #44] \n" // store r13=sp into nlr_buf
66+
#if MICROPY_NLR_NUM_REGS == 16
67+
"vstr d8, [r0, #48] \n" // store s16-s17 into nlr_buf
68+
"vstr d9, [r0, #56] \n" // store s18-s19 into nlr_buf
69+
"vstr d10, [r0, #64] \n" // store s20-s21 into nlr_buf
70+
#endif
6671
"str lr, [r0, #8] \n" // store lr into nlr_buf
6772
#endif
6873

@@ -118,6 +123,11 @@ NORETURN void nlr_jump(void *val) {
118123
"ldr r10, [r0, #36] \n" // load r10 from nlr_buf
119124
"ldr r11, [r0, #40] \n" // load r11 from nlr_buf
120125
"ldr r13, [r0, #44] \n" // load r13=sp from nlr_buf
126+
#if MICROPY_NLR_NUM_REGS == 16
127+
"vldr d8, [r0, #48] \n" // load s16-s17 from nlr_buf
128+
"vldr d9, [r0, #56] \n" // load s18-s19 from nlr_buf
129+
"vldr d10, [r0, #64] \n" // load s20-s21 from nlr_buf
130+
#endif
121131
"ldr lr, [r0, #8] \n" // load lr from nlr_buf
122132
#endif
123133
"movs r0, #1 \n" // return 1, non-local return

0 commit comments

Comments
 (0)