diff --git a/include/ck_ht.h b/include/ck_ht.h index 1ce9376..931844f 100644 --- a/include/ck_ht.h +++ b/include/ck_ht.h @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -48,8 +49,12 @@ enum ck_ht_mode { CK_HT_MODE_BYTESTRING }; +#if defined(__x86_64__) && defined(CK_MD_POINTER_PACK_ENABLE) +#define CK_HT_PP +#endif + struct ck_ht_entry { -#ifdef __x86_64__ +#ifdef CK_HT_PP uintptr_t key; uintptr_t value CK_CC_PACKED; #else @@ -108,7 +113,7 @@ CK_CC_INLINE static void ck_ht_entry_key_set(ck_ht_entry_t *entry, const void *key, uint16_t key_length) { -#ifdef __x86_64__ +#ifdef CK_HT_PP entry->key = (uintptr_t)key | ((uintptr_t)key_length << 48); #else entry->key = (uintptr_t)key; @@ -122,7 +127,7 @@ CK_CC_INLINE static void * ck_ht_entry_key(ck_ht_entry_t *entry) { -#ifdef __x86_64__ +#ifdef CK_HT_PP return (void *)(entry->key & (((uintptr_t)1 << 48) - 1)); #else return (void *)entry->key; @@ -133,7 +138,7 @@ CK_CC_INLINE static uint16_t ck_ht_entry_key_length(ck_ht_entry_t *entry) { -#ifdef __x86_64__ +#ifdef CK_HT_PP return entry->key >> 48; #else return entry->key_length; @@ -144,7 +149,7 @@ CK_CC_INLINE static void * ck_ht_entry_value(ck_ht_entry_t *entry) { -#ifdef __x86_64__ +#ifdef CK_HT_PP return (void *)(entry->value & (((uintptr_t)1 << 48) - 1)); #else return (void *)entry->value; @@ -159,7 +164,7 @@ ck_ht_entry_set(struct ck_ht_entry *entry, const void *value) { -#ifdef __x86_64__ +#ifdef CK_HT_PP entry->key = (uintptr_t)key | ((uintptr_t)key_length << 48); entry->value = (uintptr_t)value | ((uintptr_t)(h.value >> 32) << 48); #else diff --git a/src/ck_ht.c b/src/ck_ht.c index ecb6e88..2ae5a32 100644 --- a/src/ck_ht.c +++ b/src/ck_ht.c @@ -46,7 +46,7 @@ #ifndef CK_HT_BUCKET_LENGTH -#ifdef __x86_64__ +#ifdef CK_HT_PP #define CK_HT_BUCKET_SHIFT 2ULL #else #define CK_HT_BUCKET_SHIFT 1ULL @@ -195,7 +195,7 @@ ck_ht_map_probe(struct ck_ht_map *map, uint64_t probes = 0; uint64_t probe_maximum; -#ifndef __x86_64__ +#ifndef CK_HT_PP uint64_t d = 0; uint64_t d_prime = 0; retry: @@ -230,7 +230,7 @@ retry: * it is worth the code duplication. */ if (probe_limit == NULL) { -#ifdef __x86_64__ +#ifdef CK_HT_PP snapshot->key = (uintptr_t)ck_pr_load_ptr(&cursor->key); ck_pr_fence_load(); snapshot->value = (uintptr_t)ck_pr_load_ptr(&cursor->value); @@ -267,7 +267,7 @@ retry: if (map->mode == CK_HT_MODE_BYTESTRING) { void *pointer; -#ifndef __x86_64__ +#ifndef CK_HT_PP if (probe_limit == NULL) { d_prime = ck_pr_load_64(&map->deletions); @@ -288,7 +288,7 @@ retry: if (k != key_length) continue; -#ifdef __x86_64__ +#ifdef CK_HT_PP if (snapshot->value >> 48 != ((h.value >> 32) & 0xFFFF)) continue; #else @@ -504,14 +504,14 @@ ck_ht_get_spmc(ck_ht_t *table, struct ck_ht_entry *candidate, snapshot; struct ck_ht_map *map; -#ifdef __x86_64__ +#ifdef CK_HT_PP uint64_t d, d_prime; restart: #endif map = ck_pr_load_ptr(&table->map); -#ifdef __x86_64__ +#ifdef CK_HT_PP /* * Platforms that cannot read key and key_length atomically must reprobe * on the scan of any single entry. @@ -527,7 +527,7 @@ restart: (void *)entry->key, sizeof(entry->key), NULL); } -#ifdef __x86_64__ +#ifdef CK_HT_PP d_prime = ck_pr_load_64(&map->deletions); if (d != d_prime) { /* @@ -590,7 +590,7 @@ ck_ht_set_spmc(ck_ht_t *table, * before transitioning from K to T. (K, B) implies (K, B, D') * so we will reprobe successfully from this transient state. */ -#ifndef __x86_64__ +#ifndef CK_HT_PP ck_pr_store_64(&priority->key_length, entry->key_length); ck_pr_store_64(&priority->hash, entry->hash); #endif @@ -611,7 +611,7 @@ ck_ht_set_spmc(ck_ht_t *table, if (priority != NULL) candidate = priority; -#ifdef __x86_64__ +#ifdef CK_HT_PP ck_pr_store_ptr(&candidate->value, (void *)entry->value); ck_pr_fence_store(); ck_pr_store_ptr(&candidate->key, (void *)entry->key); @@ -688,7 +688,7 @@ ck_ht_put_spmc(ck_ht_t *table, if (priority != NULL) candidate = priority; -#ifdef __x86_64__ +#ifdef CK_HT_PP ck_pr_store_ptr(&candidate->value, (void *)entry->value); ck_pr_fence_store(); ck_pr_store_ptr(&candidate->key, (void *)entry->key);