From a5d76cc08337f8e8ad4151ec47ee554c3fd3517b Mon Sep 17 00:00:00 2001 From: Julian Fang Date: Fri, 5 Jul 2019 01:51:53 +0800 Subject: [PATCH] Reduce divsions in mi_heap_area_visit_blocks() --- src/heap.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/heap.c b/src/heap.c index 017b0c5f..605e7ba3 100644 --- a/src/heap.c +++ b/src/heap.c @@ -455,7 +455,19 @@ static bool mi_heap_area_visit_blocks(const mi_heap_area_ex_t* xarea, mi_block_v mi_assert_internal((uint8_t*)block >= pstart && (uint8_t*)block < (pstart + psize)); size_t offset = (uint8_t*)block - pstart; mi_assert_internal(offset % page->block_size == 0); - size_t blockidx = offset / page->block_size; // Todo: avoid division? + size_t blockidx; + size_t divident = page->block_size; + blockidx = offset >> mi_ffs32(divident); + divident >>= mi_ffs32(divident); + switch (divident) + { + case 3: blockidx/=3; + break; + case 5: blockidx/=5; + break; + case 7: blockidx/=7; + break; + } mi_assert_internal( blockidx < MI_MAX_BLOCKS); size_t bitidx = (blockidx / sizeof(uintptr_t)); size_t bit = blockidx - (bitidx * sizeof(uintptr_t));