From 69038d2d0b59ef8c87a70a24f642106665030282 Mon Sep 17 00:00:00 2001 From: Matthew Sotoudeh Date: Fri, 17 May 2024 15:28:51 -0700 Subject: fix bug & intrinsic log --- magic_buddy/magic_buddy.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'magic_buddy') diff --git a/magic_buddy/magic_buddy.c b/magic_buddy/magic_buddy.c index 1eb2d8f..1029f58 100644 --- a/magic_buddy/magic_buddy.c +++ b/magic_buddy/magic_buddy.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "magic_buddy.h" struct free_block { @@ -11,11 +12,21 @@ struct free_block { }; // log2 of size rounded up (ceil) or down (!ceil) to the nearest power of 2 +// https://stackoverflow.com/questions/11376288/fast-computing-of-log2-for-64-bit-integers static size_t size2log(size_t size, int ceil) { +#if 1 + size_t floor_log + = (8*sizeof(unsigned long long)) + - __builtin_clzll((unsigned long long)size) - 1; + if (!size) floor_log = 0; + return (ceil && (size > (1 << floor_log))) ? (floor_log + 1) : floor_log; +#else size_t floor_log = 0; for (size_t i = 0; i < (8 * sizeof(size)); i++) - if (size & (1 << i)) floor_log = i; + if (size & (1ul << i)) floor_log = i; + return (ceil && (size > (1 << floor_log))) ? (floor_log + 1) : floor_log; +#endif } static struct free_block *buddy_of(struct free_block *block, size_t logsize, -- cgit v1.2.3