Merge pull request #100 from mlochbaum/storetype

Make sure value and pointer types are compatible for Singeli stores
This commit is contained in:
dzaima 2023-12-28 00:07:45 +02:00 committed by GitHub
commit 54ca333894
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 14 deletions

View File

@ -85,7 +85,7 @@ fn write_indices{I,T}(t:*I, w:*T, n:u64) : void = {
id := i+d
wi := undefined{T}
if (id >= n) {
@for (w over j from i to n) store{t, w, cast_i{i64, j+1}}
@for (w over j from i to n) store{t, w, cast_i{I, j+1}}
goto{break}
} else if ((wi = load{w, i}) == load{w, id}) {
# Gallop
@ -102,14 +102,14 @@ fn write_indices{I,T}(t:*I, w:*T, n:u64) : void = {
l -= h
}
} else {
@unroll (j to 8) store{t, load{w, i+j}, cast_i{i64, i+j+1}}
@unroll (j to 8) store{t, load{w, i+j}, cast_i{I, i+j+1}}
i += 8
}
}
setlabel{break}
}
fn write_indices{I,T & width{I}==8}(t:*I, w:*T, n:u64) : void = {
@for (w over j to n) store{t, w, j+1}
@for (w over j to n) store{t, w, cast_i{I, j+1}}
}
def bins_lookup{I, T, up, w:*T, wn:u64, x:*T, xn:u64, rp:*void} = {
# Build table

View File

@ -149,7 +149,7 @@ def do_bittab{x0:*void, n:u64, tab:*void, u:u8, t, mode, r0} = {
btab:= *i8~~tab
def settab_sub{x, v, i} = {
if (rval) store{*u8~~r0, u, x}
if (rind and v!=t) store{r0, x, i}
if (rind and v!=t) store{r0, x, cast_i{u32, i}}
u+= u8~~i8~~(t - v) # u tracks the total of btab
store{btab, x, t}
v
@ -324,8 +324,8 @@ fn getRange{E}(x0:*void, res:*i64, n:u64) : u1 = {
max1 = max{max1, x}
}
}
store{res, 0, min1}
store{res, 1, max1}
store{res, 0, cast_i{i64, min1}}
store{res, 1, cast_i{i64, max1}}
1
}
@ -337,13 +337,13 @@ 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}) = {
fn hashtab{T, name}(rpi:*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}
def wt = width{T}
ip := *T~~iv; fp := *T~~fv
ip := *T~~iv; fp := *T~~fv; rp := if (prim=='∊') rpi else *u32~~rpi
def swap_sides{} = each{{a,b}=>{t:=a; a=b; b=t}, tup{ip,m}, tup{fp,n}}
swap:u1 = n+(1024*(prim!='⊒')) < (if (prim!='∊') m else m-m/4)
if (swap) swap_sides{}
@ -541,18 +541,18 @@ fn hashtab{T, name}(rp:*rty{name}, iv:*void, mi:usz, fv:*void, ni:usz, links:ity
}
insert_all{set, set_maxh, dup}
store{inds, get_end{}, (m-ind_maxh) &- has_maxh}
lookup_all{{found, j} => i32~~(m - (load{inds, j} &- found))}
lookup_all{{found, j} => m - (load{inds, j} &- found)}
} else { # swap
# After insert_all, position i in rp contains:
# - ≠𝕨, if i is the first occurrence of its value in 𝕩, or
# - j-≠𝕩, where j<i is the index of the first occurrence
uniq:usz = 0
has_maxh:u1 = 0
ri:i32 = 0 # Placed in rp (should be scoped to insert_all loop body)
ri:u32 = 0 # Placed in rp (should be scoped to insert_all loop body)
def dup = makelabel{}
def set_maxh{found, i, j} = {
sequester_maxh{j, found}
ri = cast_i{i32, n} # Initialize to not-found
ri = cast_i{u32, n} # Initialize to not-found
if (found & has_maxh) goto{dup}
has_maxh |= found
}
@ -560,7 +560,7 @@ fn hashtab{T, name}(rp:*rty{name}, iv:*void, mi:usz, fv:*void, ni:usz, links:ity
store{inds, j, i}
if (u1~~0) {
setlabel{dup}
ri = i32~~(load{inds, j} - m)
ri = load{inds, j} - m
}
store{rp, i, ri}
}

View File

@ -4,11 +4,12 @@ include './hashtab'
# Resizing hash table, with fallback
def rty{name} = if (to_prim{name}=='∊') i8 else i32
fn selfhashtab{T, name}(rp:*rty{name}, xp:*T, n:usz) = {
fn selfhashtab{T, name}(rpi:*rty{name}, xp:*T, n:usz) = {
def wt = width{T}
def prim = to_prim{name}
def has_radix = if (prim=='⊐') 0 else wt==32
n64 := promote{u64,n}
rp := if (prim=='∊') rpi else *u32~~rpi
def {res0,cc_stop} = if (prim=='∊') tup{1,n64>>has_radix} else tup{0,2*n64}
log := clzc{n}
@ -30,7 +31,7 @@ fn selfhashtab{T, name}(rp:*rty{name}, xp:*T, n:usz) = {
}
def {output, write_res} = match (prim) {
{('∊')} => tup{{b}=>b, {j,h,k,x0} => { hash<-{j}h; k!=h }}
{('∊')} => tup{{b}=>b, {j,h,k,x0} => { hash<-{j}h; promote{i8,k!=h} }}
{('⊒')} => {
ctr0:u32 = 1; def {val} = vals
def res{j,h,k,x0} = {