Fix fill_bittab tail masking for t=0 and simplify

This commit is contained in:
Marshall Lochbaum 2023-04-25 17:28:31 -04:00
parent 017e2433fb
commit 2fafe11d7c

View File

@ -122,19 +122,18 @@ fn fill_bittab(x0:*void, n:u64, tab:*void, u:u8, t:i8) : u8 = {
def {bitsel, reload_tab} = bittab_selector{readbytes{*VI~~tab}} def {bitsel, reload_tab} = bittab_selector{readbytes{*VI~~tab}}
xv:= *VI~~x0 xv:= *VI~~x0
while (i < n) { while (i < n) {
ii:= i+32 m:= u32~~cast_i{i32, t} ^ bitsel{load{xv, i/32}}
m:= bitsel{load{xv, i/32}} i0:= i
if (ii > n) { ii=n; m|=(~u32~~0)<<(n%32) } i+= 32
m^= u32~~cast_i{i32, t} if (i > n) m&= (~u32~~0)>>((-n)%32)
if (m != 0) { # Need to add entries if (m != 0) { # Need to add entries
do { do {
settab{load{x, i+emit{u64, 'CTZ', m}}} settab{load{x, i0 + cast_i{u64,ctz{m}}}}
m&= m-1 # Clear last bit m&= m-1 # Clear last bit
} while (m != 0) } while (m != 0)
if (u == 0) return{u} # Table is all one value if (u == 0) return{u} # Table is all one value
reload_tab{} reload_tab{}
} }
i = ii
} }
u u
} }