提交 61ff1af7 编写于 作者: S Szabolcs Nagy 提交者: Rich Felker

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).
上级 7a4c25d7
...@@ -111,19 +111,29 @@ static int first_set(uint64_t x) ...@@ -111,19 +111,29 @@ static int first_set(uint64_t x)
#endif #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) static int bin_index(size_t x)
{ {
x = x / SIZE_ALIGN - 1; x = x / SIZE_ALIGN - 1;
if (x <= 32) return x; if (x <= 32) return x;
if (x < 512) return bin_tab[x/8-4];
if (x > 0x1c00) return 63; 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) static int bin_index_up(size_t x)
{ {
x = x / SIZE_ALIGN - 1; x = x / SIZE_ALIGN - 1;
if (x <= 32) return x; 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 #if 0
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册