summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2016-12-17 15:03:24 +0100
committerRich Felker <dalias@aerifal.cx>2016-12-17 18:16:43 -0500
commit61ff1af76f4887bb7c555e4d0b8a7eeb73b05086 (patch)
tree516b3dc5144298b7b50f71eed3cc139c602e6249 /src
parent7a4c25d78030b3a43ed5c8dd1a456f73cb990f44 (diff)
downloadmusl-61ff1af76f4887bb7c555e4d0b8a7eeb73b05086.tar.gz
musl-61ff1af76f4887bb7c555e4d0b8a7eeb73b05086.tar.bz2
musl-61ff1af76f4887bb7c555e4d0b8a7eeb73b05086.tar.xz
musl-61ff1af76f4887bb7c555e4d0b8a7eeb73b05086.zip
use lookup table for malloc bin index instead of float conversion
float conversion is slow and big on soft-float targets. The lookup table increases code size a bit on most hard float targets (and adds 60byte rodata), performance can be a bit slower because of position independent data access and cpu internal state dependence (cache, extra branches), but the overall effect should be minimal (common, small size allocations should be unaffected).
Diffstat (limited to 'src')
-rw-r--r--src/malloc/malloc.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c
index b90636cc..c38c46fe 100644
--- a/src/malloc/malloc.c
+++ b/src/malloc/malloc.c
@@ -111,19 +111,29 @@ static int first_set(uint64_t x)
#endif
}
+static const unsigned char bin_tab[60] = {
+ 32,33,34,35,36,36,37,37,38,38,39,39,
+ 40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,
+ 44,44,44,44,44,44,44,44,45,45,45,45,45,45,45,45,
+ 46,46,46,46,46,46,46,46,47,47,47,47,47,47,47,47,
+};
+
static int bin_index(size_t x)
{
x = x / SIZE_ALIGN - 1;
if (x <= 32) return x;
+ if (x < 512) return bin_tab[x/8-4];
if (x > 0x1c00) return 63;
- return ((union { float v; uint32_t r; }){(int)x}.r>>21) - 496;
+ return bin_tab[x/128-4] + 16;
}
static int bin_index_up(size_t x)
{
x = x / SIZE_ALIGN - 1;
if (x <= 32) return x;
- return ((union { float v; uint32_t r; }){(int)x}.r+0x1fffff>>21) - 496;
+ x--;
+ if (x < 512) return bin_tab[x/8-4] + 1;
+ return bin_tab[x/128-4] + 17;
}
#if 0