From d933210d960a6f9337e85753e9568619bbfd54ec Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Tue, 16 Apr 2024 17:07:05 +1000 Subject: [PATCH] py/misc: Move mp_clz and mp_ctz intrinsics into misc.h. Signed-off-by: Angus Gratton --- py/asmthumb.c | 18 +----------------- py/misc.h | 18 ++++++++++++++++++ 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 - -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 + +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