summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/asmthumb.c18
-rw-r--r--py/misc.h18
2 files changed, 19 insertions, 17 deletions
diff --git a/py/asmthumb.c b/py/asmthumb.c
index 0df79e5fd..420815e80 100644
--- a/py/asmthumb.c
+++ b/py/asmthumb.c
@@ -35,23 +35,7 @@
#include "py/mpstate.h"
#include "py/asmthumb.h"
-
-#ifdef _MSC_VER
-#include <intrin.h>
-
-static uint32_t mp_clz(uint32_t x) {
- unsigned long lz = 0;
- return _BitScanReverse(&lz, x) ? (sizeof(x) * 8 - 1) - lz : 0;
-}
-
-static uint32_t mp_ctz(uint32_t x) {
- unsigned long tz = 0;
- return _BitScanForward(&tz, x) ? tz : 0;
-}
-#else
-#define mp_clz(x) __builtin_clz(x)
-#define mp_ctz(x) __builtin_ctz(x)
-#endif
+#include "py/misc.h"
#define UNSIGNED_FIT5(x) ((uint32_t)(x) < 32)
#define UNSIGNED_FIT7(x) ((uint32_t)(x) < 128)
diff --git a/py/misc.h b/py/misc.h
index eea3e8b0f..9f8a8c1e1 100644
--- a/py/misc.h
+++ b/py/misc.h
@@ -334,4 +334,22 @@ typedef const char *mp_rom_error_text_t;
// For now, forward directly to MP_COMPRESSED_ROM_TEXT.
#define MP_ERROR_TEXT(x) (mp_rom_error_text_t)MP_COMPRESSED_ROM_TEXT(x)
+// Portable implementations of CLZ and CTZ intrinsics
+#ifdef _MSC_VER
+#include <intrin.h>
+
+static uint32_t mp_clz(uint32_t x) {
+ unsigned long lz = 0;
+ return _BitScanReverse(&lz, x) ? (sizeof(x) * 8 - 1) - lz : 0;
+}
+
+static uint32_t mp_ctz(uint32_t x) {
+ unsigned long tz = 0;
+ return _BitScanForward(&tz, x) ? tz : 0;
+}
+#else
+#define mp_clz(x) __builtin_clz(x)
+#define mp_ctz(x) __builtin_ctz(x)
+#endif
+
#endif // MICROPY_INCLUDED_PY_MISC_H