From a55a088d1a39150c8446d23be2f8ab248bf9f644 Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Fri, 1 Apr 2005 17:11:55 +0000 Subject: Optimize _dl_elf_hash(), both smaller and faster. Mostly taken from glibc. --- ldso/ldso/dl-hash.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'ldso/ldso/dl-hash.c') diff --git a/ldso/ldso/dl-hash.c b/ldso/ldso/dl-hash.c index 863f8fb6e..5de38a61e 100644 --- a/ldso/ldso/dl-hash.c +++ b/ldso/ldso/dl-hash.c @@ -59,14 +59,20 @@ struct dyn_elf *_dl_handles = NULL; * it to decode the hash table. */ static inline unsigned long _dl_elf_hash(const unsigned char *name) { - unsigned long hash = 0; + unsigned long hash=0; unsigned long tmp; while (*name) { hash = (hash << 4) + *name++; - if ((tmp = hash & 0xf0000000)) - hash ^= tmp >> 24; - hash &= ~tmp; + tmp = hash & 0xf0000000; + /* The algorithm specified in the ELF ABI is as follows: + if (tmp != 0) + hash ^= tmp >> 24; + hash &= ~tmp; + But the following is equivalent and a lot + faster, especially on modern processors. */ + hash ^= tmp; + hash ^= tmp >> 24; } return hash; } -- cgit v1.2.3