diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index acecdf35..ace8e23e 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -34,6 +34,10 @@ def andnot{a:T, b if isprim{T} and knum{b}} = a & ~T~~b oper &- ({v:T,m:(u1)} => v & -promote{T,m}) infix left 35 +oper // ({a,b}=>floor{a/b}) infix left 40 + +def ptr_add{E, ptr:P, am} = { ptr = P~~(am + *E~~ptr) } + def reverse_scan{G, v} = reverse{scan{{a,b}=>G{b,a}, reverse{v}}} def tree_fold{F, x} = { @@ -275,6 +279,16 @@ def zlow{n,x} = (x >> n) << n # zero out n least significant bits def tail{n,x} = x & tail{n} # get the n least significant bits def bit {k,x} = x & (1<> idx) & 1) != 0 + +# Generalized flat transpose of iota{1< { (r0 | r1) & V**cast_i{u8, tail{s}} }} -oper // ({a,b}=>floor{a/b}) infix left 40 - def bitalign{8, {2,8,d}, G if hasarch{'AARCH64'}} = { def props = memoize{{d} => { def indz = range{16*d/8} @@ -182,7 +180,6 @@ def bitalign{8, {2,8,d}, G if hasarch{'AARCH64'}} = { }{d-2} def needs_blender = each{{c} => not all{-1==select{props{c},2}}, irange} - def reverse_scan{G, v} = reverse{scan{{a,b}=>G{b,a}, reverse{v}}} def blender = makevtabs{16, replicate{reverse_scan{|, needs_blender}, irange}, tup{i8, {d,r} => select{props{d},2}}, } @@ -198,8 +195,6 @@ def bitalign{8, {2,8,d}, G if hasarch{'AARCH64'}} = { else r01 } - def bit_lut{bits, idx} = ((u64~~base{2,bits} >> idx) & 1) != 0 - if (bit_lut{merge{2**0, needs_blender}, d}) G{d, run{1}} else G{d, run{0}} } diff --git a/src/singeli/src/bits.singeli b/src/singeli/src/bits.singeli index 122b1440..93370b56 100644 --- a/src/singeli/src/bits.singeli +++ b/src/singeli/src/bits.singeli @@ -23,8 +23,6 @@ def table{w} = each{bitsel_i{w, .}, tup{u8, u16, u32, u64}} exportT{'simd_bitsel', table{arch_defvw}} -def padd{E, ptr:P, am} = { ptr = P~~(am + *E~~ptr) } - fn bitwiden_n_8(src:*void, dst:*void, csz:ux, cam:ux) : void = { assert{cam>0} assert{(csz>1) & (csz<8)} @@ -33,7 +31,7 @@ fn bitwiden_n_8(src:*void, dst:*void, csz:ux, cam:ux) : void = { bitalign{tup{2,8,csz}, 8, {s, align} => { @maskedLoop{bulk}(dst in tup{V,*u8~~dst} over cam) { dst = align{load{*V~~src}} - padd{u8, src, bulk*s/8} + ptr_add{u8, src, bulk*s/8} } }} } @@ -50,8 +48,8 @@ export{'si_bitwiden_n_8', bitwiden_n_8} bitalign{8, tup{2,8,csz}, {s, align} => { def get{} = align{load{*V~~src}} def next{} = { - padd{u8, src, bulk} - padd{u8, dstC, bulk*s/8} + ptr_add{u8, src, bulk} + ptr_add{u8, dstC, bulk*s/8} } while (dstC+bulk < dstE) { store{*V~~dstC, 0, get{}}