diff options
author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
---|---|---|
committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/pkg/runtime/hashmap_fast.c | |
parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
download | golang-upstream/1.4.tar.gz |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/pkg/runtime/hashmap_fast.c')
-rw-r--r-- | src/pkg/runtime/hashmap_fast.c | 233 |
1 files changed, 0 insertions, 233 deletions
diff --git a/src/pkg/runtime/hashmap_fast.c b/src/pkg/runtime/hashmap_fast.c deleted file mode 100644 index 83bf6feb5..000000000 --- a/src/pkg/runtime/hashmap_fast.c +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Fast hashmap lookup specialized to a specific key type. -// Included by hashmap.c once for each specialized type. - -// +build ignore - -// Because this file is #included, it cannot be processed by goc2c, -// so we have to handle the Go resuts ourselves. - -#pragma textflag NOSPLIT -void -HASH_LOOKUP1(MapType *t, Hmap *h, KEYTYPE key, GoOutput base, ...) -{ - uintptr bucket, i; - Bucket *b; - KEYTYPE *k; - byte *v, **valueptr; - uint8 top; - int8 keymaybe; - - valueptr = (byte**)&base; - if(debug) { - runtime·prints("runtime.mapaccess1_fastXXX: map="); - runtime·printpointer(h); - runtime·prints("; key="); - t->key->alg->print(t->key->size, &key); - runtime·prints("\n"); - } - if(h == nil || h->count == 0) { - *valueptr = t->elem->zero; - return; - } - if(raceenabled) - runtime·racereadpc(h, runtime·getcallerpc(&t), HASH_LOOKUP1); - if(docheck) - check(t, h); - - if(h->B == 0) { - // One-bucket table. Don't hash, just check each bucket entry. - b = (Bucket*)h->buckets; - if(FASTKEY(key)) { - for(i = 0, k = (KEYTYPE*)b->data, v = (byte*)(k + BUCKETSIZE); i < BUCKETSIZE; i++, k++, v += h->valuesize) { - if(b->tophash[i] == Empty) - continue; - if(QUICK_NE(key, *k)) - continue; - if(QUICK_EQ(key, *k) || SLOW_EQ(key, *k)) { - *valueptr = v; - return; - } - } - } else { - keymaybe = -1; - for(i = 0, k = (KEYTYPE*)b->data, v = (byte*)(k + BUCKETSIZE); i < BUCKETSIZE; i++, k++, v += h->valuesize) { - if(b->tophash[i] == Empty) - continue; - if(QUICK_NE(key, *k)) - continue; - if(QUICK_EQ(key, *k)) { - *valueptr = v; - return; - } - if(MAYBE_EQ(key, *k)) { - if(keymaybe >= 0) { - // Two same-length strings in this bucket. - // use slow path. - // TODO: keep track of more than just 1. We could - // afford about 3 equals calls before it would be more - // expensive than 1 hash + 1 equals. - goto dohash; - } - keymaybe = i; - } - } - if(keymaybe >= 0) { - k = (KEYTYPE*)b->data + keymaybe; - if(SLOW_EQ(key, *k)) { - *valueptr = (byte*)((KEYTYPE*)b->data + BUCKETSIZE) + keymaybe * h->valuesize; - return; - } - } - } - } else { -dohash: - bucket = h->hash0; - HASHFUNC(&bucket, sizeof(KEYTYPE), &key); - top = bucket >> (sizeof(uintptr)*8 - 8); - if(top < MinTopHash) - top += MinTopHash; - bucket &= (((uintptr)1 << h->B) - 1); - if(h->oldbuckets != nil) { - i = bucket & (((uintptr)1 << (h->B - 1)) - 1); - b = (Bucket*)(h->oldbuckets + i * h->bucketsize); - if(evacuated(b)) { - b = (Bucket*)(h->buckets + bucket * h->bucketsize); - } - } else { - b = (Bucket*)(h->buckets + bucket * h->bucketsize); - } - do { - for(i = 0, k = (KEYTYPE*)b->data, v = (byte*)(k + BUCKETSIZE); i < BUCKETSIZE; i++, k++, v += h->valuesize) { - if(b->tophash[i] != top) - continue; - if(QUICK_NE(key, *k)) - continue; - if(QUICK_EQ(key, *k) || SLOW_EQ(key, *k)) { - *valueptr = v; - return; - } - } - b = b->overflow; - } while(b != nil); - } - *valueptr = t->elem->zero; -} - -#pragma textflag NOSPLIT -void -HASH_LOOKUP2(MapType *t, Hmap *h, KEYTYPE key, GoOutput base, ...) -{ - uintptr bucket, i; - Bucket *b; - KEYTYPE *k; - byte *v, **valueptr; - uint8 top; - int8 keymaybe; - bool *okptr; - - valueptr = (byte**)&base; - okptr = (bool*)(valueptr+1); - if(debug) { - runtime·prints("runtime.mapaccess2_fastXXX: map="); - runtime·printpointer(h); - runtime·prints("; key="); - t->key->alg->print(t->key->size, &key); - runtime·prints("\n"); - } - if(h == nil || h->count == 0) { - *valueptr = t->elem->zero; - *okptr = false; - return; - } - if(raceenabled) - runtime·racereadpc(h, runtime·getcallerpc(&t), HASH_LOOKUP2); - if(docheck) - check(t, h); - - if(h->B == 0) { - // One-bucket table. Don't hash, just check each bucket entry. - b = (Bucket*)h->buckets; - if(FASTKEY(key)) { - for(i = 0, k = (KEYTYPE*)b->data, v = (byte*)(k + BUCKETSIZE); i < BUCKETSIZE; i++, k++, v += h->valuesize) { - if(b->tophash[i] == Empty) - continue; - if(QUICK_NE(key, *k)) - continue; - if(QUICK_EQ(key, *k) || SLOW_EQ(key, *k)) { - *valueptr = v; - *okptr = true; - return; - } - } - } else { - keymaybe = -1; - for(i = 0, k = (KEYTYPE*)b->data, v = (byte*)(k + BUCKETSIZE); i < BUCKETSIZE; i++, k++, v += h->valuesize) { - if(b->tophash[i] == Empty) - continue; - if(QUICK_NE(key, *k)) - continue; - if(QUICK_EQ(key, *k)) { - *valueptr = v; - *okptr = true; - return; - } - if(MAYBE_EQ(key, *k)) { - if(keymaybe >= 0) { - // Two same-length strings in this bucket. - // use slow path. - // TODO: keep track of more than just 1. We could - // afford about 3 equals calls before it would be more - // expensive than 1 hash + 1 equals. - goto dohash; - } - keymaybe = i; - } - } - if(keymaybe >= 0) { - k = (KEYTYPE*)b->data + keymaybe; - if(SLOW_EQ(key, *k)) { - *valueptr = (byte*)((KEYTYPE*)b->data + BUCKETSIZE) + keymaybe * h->valuesize; - *okptr = true; - return; - } - } - } - } else { -dohash: - bucket = h->hash0; - HASHFUNC(&bucket, sizeof(KEYTYPE), &key); - top = bucket >> (sizeof(uintptr)*8 - 8); - if(top < MinTopHash) - top += MinTopHash; - bucket &= (((uintptr)1 << h->B) - 1); - if(h->oldbuckets != nil) { - i = bucket & (((uintptr)1 << (h->B - 1)) - 1); - b = (Bucket*)(h->oldbuckets + i * h->bucketsize); - if(evacuated(b)) { - b = (Bucket*)(h->buckets + bucket * h->bucketsize); - } - } else { - b = (Bucket*)(h->buckets + bucket * h->bucketsize); - } - do { - for(i = 0, k = (KEYTYPE*)b->data, v = (byte*)(k + BUCKETSIZE); i < BUCKETSIZE; i++, k++, v += h->valuesize) { - if(b->tophash[i] != top) - continue; - if(QUICK_NE(key, *k)) - continue; - if(QUICK_EQ(key, *k) || SLOW_EQ(key, *k)) { - *valueptr = v; - *okptr = true; - return; - } - } - b = b->overflow; - } while(b != nil); - } - *valueptr = t->elem->zero; - *okptr = false; -} |