Skip to content

Commit 9ac949c

Browse files
committed
py/persistentcode: Make ARM Thumb archs support multiple sub-archs.
1 parent 42c1aed commit 9ac949c

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

py/persistentcode.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -526,9 +526,11 @@ mp_raw_code_t *mp_raw_code_load(mp_reader_t *reader) {
526526
|| read_uint(reader, NULL) > QSTR_WINDOW_SIZE) {
527527
mp_raise_ValueError("incompatible .mpy file");
528528
}
529-
if (MPY_FEATURE_DECODE_ARCH(header[2]) != MP_NATIVE_ARCH_NONE
530-
&& MPY_FEATURE_DECODE_ARCH(header[2]) != MPY_FEATURE_ARCH) {
531-
mp_raise_ValueError("incompatible .mpy arch");
529+
if (MPY_FEATURE_DECODE_ARCH(header[2]) != MP_NATIVE_ARCH_NONE) {
530+
byte arch = MPY_FEATURE_DECODE_ARCH(header[2]);
531+
if (!MPY_FEATURE_ARCH_TEST(arch)) {
532+
mp_raise_ValueError("incompatible .mpy arch");
533+
}
532534
}
533535
qstr_window_t qw;
534536
qw.idx = 0;

py/persistentcode.h

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,34 @@
5555

5656
// Define the host architecture
5757
#if MICROPY_EMIT_X86
58-
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_X86)
58+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_X86)
5959
#elif MICROPY_EMIT_X64
60-
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_X64)
60+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_X64)
6161
#elif MICROPY_EMIT_THUMB
62-
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV7M)
62+
#if defined(__thumb2__)
63+
#if defined(__ARM_FP) && (__ARM_FP & 8) == 8
64+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV7EMDP)
65+
#elif defined(__ARM_FP) && (__ARM_FP & 4) == 4
66+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV7EMSP)
67+
#else
68+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV7EM)
69+
#endif
70+
#else
71+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV7M)
72+
#endif
73+
#define MPY_FEATURE_ARCH_TEST(x) (MP_NATIVE_ARCH_ARMV6M <= (x) && (x) <= MPY_FEATURE_ARCH)
6374
#elif MICROPY_EMIT_ARM
64-
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV6)
75+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV6)
6576
#elif MICROPY_EMIT_XTENSA
66-
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSA)
77+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSA)
6778
#elif MICROPY_EMIT_XTENSAWIN
68-
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSAWIN)
79+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSAWIN)
6980
#else
70-
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_NONE)
81+
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_NONE)
82+
#endif
83+
84+
#ifndef MPY_FEATURE_ARCH_TEST
85+
#define MPY_FEATURE_ARCH_TEST(x) ((x) == MPY_FEATURE_ARCH)
7186
#endif
7287

7388
// 16-bit little-endian integer with the second and third bytes of supported .mpy files

0 commit comments

Comments
 (0)