summaryrefslogtreecommitdiff
path: root/py/asmthumb.c
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-05-24 13:37:56 +1000
committerDamien George <damien@micropython.org>2022-05-24 22:27:18 +1000
commitaa53d2f84a2171b53bd43459b84a1b5348241b43 (patch)
treec9836137dc25248f32dbcca76cc03058f6c11a17 /py/asmthumb.c
parentdd35f76db330851bdf937585219d5cae21222fa3 (diff)
py/asmthumb: Provide implementations of clz/ctz for msvc.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/asmthumb.c')
-rw-r--r--py/asmthumb.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/py/asmthumb.c b/py/asmthumb.c
index 8d47575e9..49574c43a 100644
--- a/py/asmthumb.c
+++ b/py/asmthumb.c
@@ -36,6 +36,23 @@
#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
+
#define UNSIGNED_FIT5(x) ((uint32_t)(x) < 32)
#define UNSIGNED_FIT7(x) ((uint32_t)(x) < 128)
#define UNSIGNED_FIT8(x) (((x) & 0xffffff00) == 0)
@@ -356,8 +373,8 @@ void asm_thumb_mov_reg_i32_optimised(asm_thumb_t *as, uint reg_dest, int i32) {
i32 = -i32;
}
- uint clz = __builtin_clz(i32);
- uint ctz = i32 ? __builtin_ctz(i32) : 0;
+ uint clz = mp_clz(i32);
+ uint ctz = i32 ? mp_ctz(i32) : 0;
assert(clz + ctz <= 32);
if (clz + ctz >= 24) {
asm_thumb_mov_rlo_i8(as, rlo_dest, (i32 >> ctz) & 0xff);