From 8a2190b09253fe5e3a584f98a82c5cf3a02d2408 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 7 Nov 2023 14:50:26 -0500 Subject: [PATCH] 64-bit hashes with float normalization --- src/builtins/search.c | 31 +++++++++++++++++++++++++------ src/singeli/src/search.singeli | 11 ++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/builtins/search.c b/src/builtins/search.c index 90ad0e4a..bd910283 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -65,6 +65,13 @@ extern B mul_c2(B,B,B); extern B join_c2(B,B,B); extern B select_c2(B,B,B); +B asNormalized(B x, usz n, bool nanBad); +SHOULD_INLINE bool canCompare64_norm(B* w, usz wia, B* x, usz xia) { + B wn=asNormalized(*w,wia,true); if (wn.u == m_f64(0).u) return 0; *w=wn; + B xn=asNormalized(*x,xia,true); if (xn.u == m_f64(0).u) return 0; *x=xn; + return 1; +} + static u64 elRange(u8 eltype) { return 1ull<<(1< 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}, ip:*T, m:usz, fp:*T, n:usz, links:ity{name}) = { +fn hashtab{T, name}(rp:*rty{name}, iv:*void, m:usz, fv:*void, n:usz, links:ity{name}) = { def wt = width{T} def prim = to_prim{name} + ip := *T~~iv; fp := *T~~fv swap:u1 = 0 if (prim=='⊒' and (swap = n < m)) { each{{a,b}=>{t:=a; a=b; b=t}, tup{ip,m}, tup{fp,n}} @@ -501,7 +502,7 @@ fn hashtab{T, name}(rp:*rty{name}, ip:*T, m:usz, fp:*T, n:usz, links:ity{name}) i == m # Whether it finished } -def try_vec_memb{} = {} +def try_vec_memb{..._} = {} def try_vec_memb{T, hash, hashlen, sh, maxh, has_maxh, rp, fp, n, done & hasarch{'SSE4.2'} & T==u32} = { # Hash h wants bin h>>sh, so the offset for h in slot i is (in infite-precision ints) @@ -543,7 +544,7 @@ def try_vec_memb{T, hash, hashlen, sh, maxh, has_maxh, rp, fp, n, done each{try, tup{1,2}} } -def exp_hash{T, name} = { - export{merge{name,'_c2_hash',fmtnat{width{T}}}, hashtab{T, name}} +def exp_hash{name} = { + exportT{merge{'si_',name,'_c2_hash'}, each{hashtab{., name}, tup{u32,u64}}} } -each{{n}=>each{exp_hash{.,n},tup{u32}}, names} +each{exp_hash, names}