summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2019-12-12 15:51:13 -0500
committerDan Halbert <halbert@halwitz.org>2019-12-12 15:51:13 -0500
commitef2ef7a6b8c30dd64753e2ceca7587d9ead90e44 (patch)
treeada3663598b60f30a1ba53b3a8ff5b8143af8e76 /py
parente11fabd5e0979fa257a81d6025a0df0b6652b600 (diff)
parentbcd03ed7ee6cfbf0f3be926c2f7912201c5a7ca6 (diff)
merge from master
Diffstat (limited to 'py')
-rwxr-xr-xpy/mpconfig.h9
-rw-r--r--py/nlr.h9
-rw-r--r--py/nlrthumb.c16
-rw-r--r--py/nlrx64.c2
-rw-r--r--py/nlrx86.c2
-rw-r--r--py/nlrxtensa.c2
6 files changed, 31 insertions, 9 deletions
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 3ec383817..a0d211bfa 100755
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -1440,6 +1440,15 @@ typedef double mp_float_t;
#define MP_UNLIKELY(x) __builtin_expect((x), 0)
#endif
+// To annotate that code is unreachable
+#ifndef MP_UNREACHABLE
+#if defined(__GNUC__)
+#define MP_UNREACHABLE __builtin_unreachable();
+#else
+#define MP_UNREACHABLE for (;;);
+#endif
+#endif
+
#ifndef MP_HTOBE16
#if MP_ENDIANNESS_LITTLE
# define MP_HTOBE16(x) ((uint16_t)( (((x) & 0xff) << 8) | (((x) >> 8) & 0xff) ))
diff --git a/py/nlr.h b/py/nlr.h
index b442aaf8a..1b95002d3 100644
--- a/py/nlr.h
+++ b/py/nlr.h
@@ -54,7 +54,14 @@
#endif
#elif defined(__thumb2__) || defined(__thumb__) || defined(__arm__)
#define MICROPY_NLR_THUMB (1)
- #define MICROPY_NLR_NUM_REGS (10)
+ #if defined(__SOFTFP__)
+ #define MICROPY_NLR_NUM_REGS (10)
+ #else
+ // With hardware FP registers s16-s31 are callee save so in principle
+ // should be saved and restored by the NLR code. gcc only uses s16-s21
+ // so only save/restore those as an optimisation.
+ #define MICROPY_NLR_NUM_REGS (10 + 6)
+ #endif
#elif defined(__xtensa__)
#define MICROPY_NLR_XTENSA (1)
#define MICROPY_NLR_NUM_REGS (10)
diff --git a/py/nlrthumb.c b/py/nlrthumb.c
index 69d3f868a..056aa358e 100644
--- a/py/nlrthumb.c
+++ b/py/nlrthumb.c
@@ -63,6 +63,11 @@ __attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
"str r10, [r0, #36] \n" // store r10 into nlr_buf
"str r11, [r0, #40] \n" // store r11 into nlr_buf
"str r13, [r0, #44] \n" // store r13=sp into nlr_buf
+ #if MICROPY_NLR_NUM_REGS == 16
+ "vstr d8, [r0, #48] \n" // store s16-s17 into nlr_buf
+ "vstr d9, [r0, #56] \n" // store s18-s19 into nlr_buf
+ "vstr d10, [r0, #64] \n" // store s20-s21 into nlr_buf
+ #endif
"str lr, [r0, #8] \n" // store lr into nlr_buf
#endif
@@ -118,6 +123,11 @@ NORETURN void nlr_jump(void *val) {
"ldr r10, [r0, #36] \n" // load r10 from nlr_buf
"ldr r11, [r0, #40] \n" // load r11 from nlr_buf
"ldr r13, [r0, #44] \n" // load r13=sp from nlr_buf
+ #if MICROPY_NLR_NUM_REGS == 16
+ "vldr d8, [r0, #48] \n" // load s16-s17 from nlr_buf
+ "vldr d9, [r0, #56] \n" // load s18-s19 from nlr_buf
+ "vldr d10, [r0, #64] \n" // load s20-s21 from nlr_buf
+ #endif
"ldr lr, [r0, #8] \n" // load lr from nlr_buf
#endif
"movs r0, #1 \n" // return 1, non-local return
@@ -127,11 +137,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
- #if defined(__GNUC__)
- __builtin_unreachable();
- #else
- for (;;); // needed to silence compiler warning
- #endif
+ MP_UNREACHABLE
}
#endif // MICROPY_NLR_THUMB
diff --git a/py/nlrx64.c b/py/nlrx64.c
index 9b2b22c22..569ad84fb 100644
--- a/py/nlrx64.c
+++ b/py/nlrx64.c
@@ -108,7 +108,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
- for (;;); // needed to silence compiler warning
+ MP_UNREACHABLE
}
#endif // MICROPY_NLR_X64
diff --git a/py/nlrx86.c b/py/nlrx86.c
index 4900a4c0d..6fbbe4432 100644
--- a/py/nlrx86.c
+++ b/py/nlrx86.c
@@ -100,7 +100,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
- for (;;); // needed to silence compiler warning
+ MP_UNREACHABLE
}
#endif // MICROPY_NLR_X86
diff --git a/py/nlrxtensa.c b/py/nlrxtensa.c
index d66c7a9a7..564035004 100644
--- a/py/nlrxtensa.c
+++ b/py/nlrxtensa.c
@@ -77,7 +77,7 @@ NORETURN void nlr_jump(void *val) {
: // clobbered registers
);
- for (;;); // needed to silence compiler warning
+ MP_UNREACHABLE
}
#endif // MICROPY_NLR_XTENSA