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 &- ({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 reverse_scan{G, v} = reverse{scan{{a,b}=>G{b,a}, reverse{v}}}
|
||||||
|
|
||||||
def tree_fold{F, x} = {
|
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 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 {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
|
# range logic
|
||||||
def inRangeLen{x:TS=[_]T, start, count if issigned{T}} = { # ∊ [start;start+count)
|
def inRangeLen{x:TS=[_]T, start, count if issigned{T}} = { # ∊ [start;start+count)
|
||||||
def TU = ty_u{TS}
|
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}}
|
(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 bitalign{8, {2,8,d}, G if hasarch{'AARCH64'}} = {
|
||||||
def props = memoize{{d} => {
|
def props = memoize{{d} => {
|
||||||
def indz = range{16*d/8}
|
def indz = range{16*d/8}
|
||||||
@ -182,7 +180,6 @@ def bitalign{8, {2,8,d}, G if hasarch{'AARCH64'}} = {
|
|||||||
}{d-2}
|
}{d-2}
|
||||||
|
|
||||||
def needs_blender = each{{c} => not all{-1==select{props{c},2}}, irange}
|
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},
|
def blender = makevtabs{16, replicate{reverse_scan{|, needs_blender}, irange},
|
||||||
tup{i8, {d,r} => select{props{d},2}},
|
tup{i8, {d,r} => select{props{d},2}},
|
||||||
}
|
}
|
||||||
@ -198,8 +195,6 @@ def bitalign{8, {2,8,d}, G if hasarch{'AARCH64'}} = {
|
|||||||
else r01
|
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}}
|
if (bit_lut{merge{2**0, needs_blender}, d}) G{d, run{1}}
|
||||||
else G{d, run{0}}
|
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}}
|
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 = {
|
fn bitwiden_n_8(src:*void, dst:*void, csz:ux, cam:ux) : void = {
|
||||||
assert{cam>0}
|
assert{cam>0}
|
||||||
assert{(csz>1) & (csz<8)}
|
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} => {
|
bitalign{tup{2,8,csz}, 8, {s, align} => {
|
||||||
@maskedLoop{bulk}(dst in tup{V,*u8~~dst} over cam) {
|
@maskedLoop{bulk}(dst in tup{V,*u8~~dst} over cam) {
|
||||||
dst = align{load{*V~~src}}
|
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} => {
|
bitalign{8, tup{2,8,csz}, {s, align} => {
|
||||||
def get{} = align{load{*V~~src}}
|
def get{} = align{load{*V~~src}}
|
||||||
def next{} = {
|
def next{} = {
|
||||||
padd{u8, src, bulk}
|
ptr_add{u8, src, bulk}
|
||||||
padd{u8, dstC, bulk*s/8}
|
ptr_add{u8, dstC, bulk*s/8}
|
||||||
}
|
}
|
||||||
while (dstC+bulk < dstE) {
|
while (dstC+bulk < dstE) {
|
||||||
store{*V~~dstC, 0, get{}}
|
store{*V~~dstC, 0, get{}}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user