more definitions in base.singeli
This commit is contained in:
parent
3fc92eceaa
commit
f356ba0f36
@ -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<<k) # get the k-th bit
|
||||
|
||||
def bit_lut{bits, idx if length{bits}<64 and all{(bits&1) == bits}} = ((base{2,bits} >> idx) & 1) != 0
|
||||
|
||||
# Generalized flat transpose of iota{1<<length{bs}}
|
||||
# select{tr_iota{bs}, x} sends bit i of x to position select{bs, i}
|
||||
def tr_iota{...bs} = {
|
||||
def axes = each{tup{0,.}, 1<<bs}
|
||||
fold{flat_table{|,...}, reverse{axes}}
|
||||
}
|
||||
def tr_iota{{...bs}} = tr_iota{...bs}
|
||||
|
||||
# range logic
|
||||
def inRangeLen{x:TS=[_]T, start, count if issigned{T}} = { # ∊ [start;start+count)
|
||||
def TU = ty_u{TS}
|
||||
|
||||
@ -152,8 +152,6 @@ def bitalign{{2,8,s}, 8, G if hasarch{'AARCH64'}} = G{s, {a:V=([16]u8)} => {
|
||||
(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}}
|
||||
}
|
||||
|
||||
@ -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{}}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user