From 52943917ad0b154fe21d40496e32db15a23d6efb Mon Sep 17 00:00:00 2001 From: Jim Huang Date: Wed, 21 Apr 2021 13:14:53 +0000 Subject: [PATCH] Rewrite align_down with bitwise operations mi_align_down_ptr was implemented with multiplication and division, which can be converted to equivalent and deterministic bit operations. --- src/os.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/os.c b/src/os.c index 18105596..fc971a44 100644 --- a/src/os.c +++ b/src/os.c @@ -65,7 +65,11 @@ static void* mi_align_up_ptr(void* p, size_t alignment) { return (void*)_mi_align_up((uintptr_t)p, alignment); } -static uintptr_t _mi_align_down(uintptr_t sz, size_t alignment) { +static inline uintptr_t _mi_align_down(uintptr_t sz, size_t alignment) { + mi_assert_internal(alignment != 0); + uintptr_t mask = alignment - 1; + if ((alignment & mask) == 0) // power of two? + return sz & ~mask; return (sz / alignment) * alignment; }