From b4e53abbe4253f3dff212a9838633957f5ad5c34 Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 13 Nov 2023 16:14:04 +0200 Subject: [PATCH] some comments --- src/singeli/src/hashtab.singeli | 10 +++++++--- src/singeli/src/search.singeli | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/singeli/src/hashtab.singeli b/src/singeli/src/hashtab.singeli index 4c34caf4..411a8d5d 100644 --- a/src/singeli/src/hashtab.singeli +++ b/src/singeli/src/hashtab.singeli @@ -36,6 +36,7 @@ def hash_val{x:u32 & hasarch{'SSE4.2'}} = { # Allocate and initialize resizing hash table # Initial size sz+ext and maximum size msz+ext # One region for each type in Ts initialized with value from v0s +# Allocates the maximum at the start, resizes downwards within the existing allocation def hash_alloc{logsz, msz, ext, Ts, v0s, has_radix, ordered} = { def ws = each{width,Ts} def wt = tupsel{0,ws} @@ -56,15 +57,18 @@ def hash_alloc{logsz, msz, ext, Ts, v0s, has_radix, ordered} = { each{memset{., ., sze}, ptrs, v0s} def hash_resize{cc, m} = { - dif := sz*((1< { p -= dif; memset{p, v, dif} }, ptrs, v0s} def {hash, ...vals} = ptrs; def {h0, ...v0r} = v0s s := sz+ext i := dif + + # Iterate over existing elements in blocks of e<=32 + # Branchlessly skips over h0 while (i < s) { e := min{s-i, usz~~32} b:u32 = 0 diff --git a/src/singeli/src/search.singeli b/src/singeli/src/search.singeli index 1a0739c6..8b44ec61 100644 --- a/src/singeli/src/search.singeli +++ b/src/singeli/src/search.singeli @@ -338,6 +338,7 @@ oper &- ({v:T,m} => v & -promote{T,m}) infix left 35 def rty{name} = if (to_prim{name}=='∊') i8 else i32 def ity{name} = (to_prim{name}=='⊒')**(*u32) fn hashtab{T, name}(rp:*rty{name}, iv:*void, mi:usz, fv:*void, ni:usz, links:ity{name}) = { + # iv,mi/ip,m - searched-in; fv,ni/fp,n - searched-for; may get swapped around & back def prim = to_prim{name} def U = if (prim=='∊') usz else u32 m := cast_i{U,mi}; n := cast_i{U,ni}