aboutsummaryrefslogtreecommitdiff
path: root/src/hashtab.c
diff options
context:
space:
mode:
authorFelipe Oliveira Carvalho <felipekde@gmail.com>2014-04-19 13:12:04 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-04-24 10:32:47 -0300
commitdb23cb05d1d40487007b3c93dd54fab290fd02b7 (patch)
treee43f5a0cc4314e239015de512b636c93a005dc83 /src/hashtab.c
parent9a5b3eee5f73594f5e3f71411f6a7d4fe2b9da55 (diff)
downloadrneovim-db23cb05d1d40487007b3c93dd54fab290fd02b7.tar.gz
rneovim-db23cb05d1d40487007b3c93dd54fab290fd02b7.tar.bz2
rneovim-db23cb05d1d40487007b3c93dd54fab290fd02b7.zip
Use /2 and 2* instead of >>1 and <<1 which are tricky with signed types
Today's compilers generate shift instructions to perform division and multiplications by powers of 2 [1]. `(x >> 1)` looks straightforward enough, but if x is signed the code will fail when x < 0. The compiler knows better: use `x / 2`. That's why we have code like this: (long)((long_u)Rows >> 1)) instead of the cleaner version that generates the same or better machine code: Rows / 2 [1] http://goo.gl/J4WpG7
Diffstat (limited to 'src/hashtab.c')
-rw-r--r--src/hashtab.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/hashtab.c b/src/hashtab.c
index b84b56278f..a43180d6cb 100644
--- a/src/hashtab.c
+++ b/src/hashtab.c
@@ -141,7 +141,7 @@ hashitem_T* hash_lookup(hashtab_T *ht, char_u *key, hash_T hash)
// count a "miss" for hashtab lookup
hash_count_perturb++;
#endif // ifdef HT_DEBUG
- idx = (unsigned)((idx << 2U) + idx + perturb + 1U);
+ idx = 5 * idx + perturb + 1;
hi = &ht->ht_array[idx & ht->ht_mask];
if (hi->hi_key == NULL) {
@@ -378,7 +378,7 @@ static int hash_may_resize(hashtab_T *ht, int minitems)
newitem = &newarray[newi];
if (newitem->hi_key != NULL) {
for (perturb = olditem->hi_hash;; perturb >>= PERTURB_SHIFT) {
- newi = (unsigned)((newi << 2U) + newi + perturb + 1U);
+ newi = 5 * newi + perturb + 1;
newitem = &newarray[newi & newmask];
if (newitem->hi_key == NULL) {
break;