From 01d21b0a448d07d4b63583a296f34771267df8c9 Mon Sep 17 00:00:00 2001 From: Nick Briggs Date: Tue, 22 Jul 2025 09:43:49 -0700 Subject: [PATCH] Revert integerlength() to pure (but more efficient) C as glibc does not provide fls() --- src/gcfinal.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/gcfinal.c b/src/gcfinal.c index 5a4ad85..b5a4244 100644 --- a/src/gcfinal.c +++ b/src/gcfinal.c @@ -43,7 +43,6 @@ /*************************************************************************/ #include // for printf -#include // for fls #include "address.h" // for HILOC #include "adr68k.h" // for NativeAligned4FromLAddr, LAddrFromNative #include "array.h" // for arrayblock, ARRAYBLOCKTRAILERCELLS, MAXBUCK... @@ -128,7 +127,29 @@ struct buffer { #endif /* BYTESWAP */ static int integerlength(unsigned int n) { - return (fls(n)); + int p = 0; + + if (n <= 2) return (n); /* easy case */ + if (n >= 65536) { + n >>= 16; + p += 16; + } + if (n >= 256) { + n >>= 8; + p += 8; + } + if (n >= 16) { + n >>= 4; + p += 4; + } + if (n >= 4) { + n >>= 2; + p += 2; + } + if (n >= 2) { + p += 1; + } + return (p + 1); } /************************************************************************/