mirror of
https://github.com/fluencelabs/musl
synced 2025-07-04 00:51:59 +00:00
malloc: cast size down to int in bin_index functions
even if size_t was 32-bit already, the fact that the value was unsigned and that gcc is too stupid to figure out it would be positive as a signed quantity (due to the immediately-prior arithmetic and conditionals) results in gcc compiling the integer-to-float conversion as zero extension to 64 bits followed by an "fildll" (64 bit) instruction rather than a simple "fildl" (32 bit) instruction on x86. reportedly fildll is very slow on certain p4-class machines; even if not, the new code is slightly smaller.
This commit is contained in:
@ -120,14 +120,14 @@ 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 > 0x1c00) return 63;
|
if (x > 0x1c00) return 63;
|
||||||
return ((union { float v; uint32_t r; }){ x }.r>>21) - 496;
|
return ((union { float v; uint32_t r; }){(int)x}.r>>21) - 496;
|
||||||
}
|
}
|
||||||
|
|
||||||
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; }){ x }.r+0x1fffff>>21) - 496;
|
return ((union { float v; uint32_t r; }){(int)x}.r+0x1fffff>>21) - 496;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
Reference in New Issue
Block a user