mirror of git://sourceware.org/git/glibc.git
Small optimization of generic ELF hash function
This commit is contained in:
parent
52ff5dd0e4
commit
52ad36a219
|
@ -1,6 +1,7 @@
|
|||
2011-12-04 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* sysdeps/generic/dl-hash.h (_dl_elf_hash): Fix attribute.
|
||||
Minor optimizations.
|
||||
|
||||
* sunrpc/clnt_unix.c (clntunix_control): Fix aliasing issues.
|
||||
* sunrpc/clnt_tcp.c (clnttcp_control): Likewise.
|
||||
|
|
|
@ -29,42 +29,39 @@ __attribute__ ((unused))
|
|||
_dl_elf_hash (const char *name_arg)
|
||||
{
|
||||
const unsigned char *name = (const unsigned char *) name_arg;
|
||||
unsigned long int hash = 0;
|
||||
if (*name != '\0')
|
||||
unsigned long int hash = *name;
|
||||
if (hash != 0 && name[1] != '\0')
|
||||
{
|
||||
hash = *name++;
|
||||
if (*name != '\0')
|
||||
hash = (hash << 4) + name[1];
|
||||
if (name[2] != '\0')
|
||||
{
|
||||
hash = (hash << 4) + *name++;
|
||||
if (*name != '\0')
|
||||
hash = (hash << 4) + name[2];
|
||||
if (name[3] != '\0')
|
||||
{
|
||||
hash = (hash << 4) + *name++;
|
||||
if (*name != '\0')
|
||||
hash = (hash << 4) + name[3];
|
||||
if (name[4] != '\0')
|
||||
{
|
||||
hash = (hash << 4) + *name++;
|
||||
if (*name != '\0')
|
||||
hash = (hash << 4) + name[4];
|
||||
name += 5;
|
||||
while (*name != '\0')
|
||||
{
|
||||
unsigned long int hi;
|
||||
hash = (hash << 4) + *name++;
|
||||
while (*name != '\0')
|
||||
{
|
||||
unsigned long int hi;
|
||||
hash = (hash << 4) + *name++;
|
||||
hi = hash & 0xf0000000;
|
||||
hi = hash & 0xf0000000;
|
||||
|
||||
/* The algorithm specified in the ELF ABI is as
|
||||
follows:
|
||||
/* The algorithm specified in the ELF ABI is as
|
||||
follows:
|
||||
|
||||
if (hi != 0)
|
||||
hash ^= hi >> 24;
|
||||
if (hi != 0)
|
||||
hash ^= hi >> 24;
|
||||
|
||||
hash &= ~hi;
|
||||
hash &= ~hi;
|
||||
|
||||
But the following is equivalent and a lot
|
||||
faster, especially on modern processors. */
|
||||
But the following is equivalent and a lot
|
||||
faster, especially on modern processors. */
|
||||
|
||||
hash ^= hi;
|
||||
hash ^= hi >> 24;
|
||||
}
|
||||
hash ^= hi;
|
||||
hash ^= hi >> 24;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue