mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Load 8 bytes at a time in hash_func. (Sebastian Pop)
This commit is contained in:
parent
bec6ff9021
commit
071793a0bb
1 changed files with 20 additions and 0 deletions
|
@ -364,6 +364,25 @@ static zend_always_inline zend_ulong zend_inline_hash_func(const char *str, size
|
|||
#if defined(_WIN32) || defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)
|
||||
/* Version with multiplication works better on modern CPU */
|
||||
for (; len >= 8; len -= 8, str += 8) {
|
||||
# if defined(__aarch64__)
|
||||
/* On some architectures it is beneficial to load 8 bytes at a
|
||||
time and extract each byte with a bit field extract instr. */
|
||||
uint64_t chunk;
|
||||
|
||||
memcpy(&chunk, str, sizeof(chunk));
|
||||
hash =
|
||||
hash * 33 * 33 * 33 * 33 +
|
||||
((chunk >> (8 * 0)) & 0xff) * 33 * 33 * 33 +
|
||||
((chunk >> (8 * 1)) & 0xff) * 33 * 33 +
|
||||
((chunk >> (8 * 2)) & 0xff) * 33 +
|
||||
((chunk >> (8 * 3)) & 0xff);
|
||||
hash =
|
||||
hash * 33 * 33 * 33 * 33 +
|
||||
((chunk >> (8 * 4)) & 0xff) * 33 * 33 * 33 +
|
||||
((chunk >> (8 * 5)) & 0xff) * 33 * 33 +
|
||||
((chunk >> (8 * 6)) & 0xff) * 33 +
|
||||
((chunk >> (8 * 7)) & 0xff);
|
||||
# else
|
||||
hash =
|
||||
hash * 33 * 33 * 33 * 33 +
|
||||
str[0] * 33 * 33 * 33 +
|
||||
|
@ -376,6 +395,7 @@ static zend_always_inline zend_ulong zend_inline_hash_func(const char *str, size
|
|||
str[5] * 33 * 33 +
|
||||
str[6] * 33 +
|
||||
str[7];
|
||||
# endif
|
||||
}
|
||||
if (len >= 4) {
|
||||
hash =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue