Merge 3 to 7 replicate float with other types: shuffle instead of permute
This commit is contained in:
parent
29886f355a
commit
582afe33c9
@ -108,7 +108,7 @@ def read_shuf_vecs{l, elbytes:u64, shp:*[32]i8} = {
|
|||||||
if (elbytes<=e) set{slice{iota{n},m}}
|
if (elbytes<=e) set{slice{iota{n},m}}
|
||||||
else slice{sh,0,n} = doubles{n,slice{sh,0,m}}
|
else slice{sh,0,n} = doubles{n,slice{sh,0,m}}
|
||||||
}
|
}
|
||||||
set{iota{tlen{4}}}; ext{2}; ext{1}
|
set{iota{tlen{8}}}; ext{4}; ext{2}; ext{1}
|
||||||
sh
|
sh
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ def rep_const_shuffle{V, wv, onreps, xv:*V, rv:*V, n:u64} = {
|
|||||||
}
|
}
|
||||||
def rep_const_shuffle{V, wv, xv:*V, rv:*V, n:u64} = rep_const_shuffle{V, wv, get_rep_iter{V, wv}, xv, rv, n}
|
def rep_const_shuffle{V, wv, xv:*V, rv:*V, n:u64} = rep_const_shuffle{V, wv, get_rep_iter{V, wv}, xv, rv, n}
|
||||||
|
|
||||||
def rcsh_vals = incl{3, 7}
|
def rcsh_vals = slice{basic_rep, 1} # Handle 2 specially
|
||||||
rcsh_offs:*u8 = shiftright{0, scan{+,rcsh_vals}}
|
rcsh_offs:*u8 = shiftright{0, scan{+,rcsh_vals}}
|
||||||
rcsh_data:*i8 = join{join{each{get_shuf_data, rcsh_vals}}}
|
rcsh_data:*i8 = join{join{each{get_shuf_data, rcsh_vals}}}
|
||||||
rcsh_sub{wv}(elbytes:u64, x:*i8, r:*i8, n:u64, sh:*[32]i8) : void = {
|
rcsh_sub{wv}(elbytes:u64, x:*i8, r:*i8, n:u64, sh:*[32]i8) : void = {
|
||||||
@ -143,10 +143,6 @@ rcsh_sub{wv}(elbytes:u64, x:*i8, r:*i8, n:u64, sh:*[32]i8) : void = {
|
|||||||
def st = read_shuf_vecs{wv, elbytes, sh}
|
def st = read_shuf_vecs{wv, elbytes, sh}
|
||||||
rep_const_shuffle{V, wv, rep_iter_from_sh{st}, *V~~x, *V~~r, n}
|
rep_const_shuffle{V, wv, rep_iter_from_sh{st}, *V~~x, *V~~r, n}
|
||||||
}
|
}
|
||||||
rep_const_shuffle_full(wv:i32, eb:u64, x:*i8, r:*i8, n:u64, sh:*[32]i8) : void = {
|
|
||||||
def try{k} = { if (wv==k) rcsh_sub{k}(eb, x, r, n, sh) }
|
|
||||||
each{try, rcsh_vals}
|
|
||||||
}
|
|
||||||
|
|
||||||
def rcsh4_dom = replicate{bind{>=,64}, replicate{fact_tab==1, fact_inds}}
|
def rcsh4_dom = replicate{bind{>=,64}, replicate{fact_tab==1, fact_inds}}
|
||||||
rcsh4_dat:*i8 = join{join{each{{wv}=>get_shuf_data{wv, 4}, rcsh4_dom}}}
|
rcsh4_dat:*i8 = join{join{each{{wv}=>get_shuf_data{wv, 4}, rcsh4_dom}}}
|
||||||
@ -181,6 +177,17 @@ rep_const_shuffle_partial4(wv:u64, elbytes:u64, x:*i8, r:*i8, n:u64) : void = {
|
|||||||
if (q) maskstoreF{*V~~r, maskOf{V, q}, 0, s}
|
if (q) maskstoreF{*V~~r, maskOf{V, q}, 0, s}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rep_const_shuffle_any(wv:i32, elbytes:u64, x:*i8, r:*i8, n:u64) : void = {
|
||||||
|
if (wv > tupsel{-1,rcsh_vals}) {
|
||||||
|
return{rep_const_shuffle_partial4(wv, elbytes, x, r, n)}
|
||||||
|
}
|
||||||
|
n *= elbytes
|
||||||
|
ri := wv - tupsel{0,rcsh_vals}
|
||||||
|
sh := *[32]i8~~rcsh_data + load{rcsh_offs,ri}
|
||||||
|
def try{k} = { if (wv==k) rcsh_sub{k}(elbytes, x, r, n, sh) }
|
||||||
|
each{try, rcsh_vals}
|
||||||
|
}
|
||||||
|
|
||||||
def rep_const_broadcast{T, kv, loop, wv:u64, x:*T, r:*T, n:u64} = {
|
def rep_const_broadcast{T, kv, loop, wv:u64, x:*T, r:*T, n:u64} = {
|
||||||
assert{kv > 0}
|
assert{kv > 0}
|
||||||
def V = [256/width{T}]T
|
def V = [256/width{T}]T
|
||||||
@ -215,20 +222,8 @@ rep_const{T}(wv:i32, x:*void, r:*void, n:u64) : void = {
|
|||||||
def specialize{k} = {
|
def specialize{k} = {
|
||||||
if (wv==k) return{rep_const_shuffle{V, k, *V~~x, *V~~r, n}}
|
if (wv==k) return{rep_const_shuffle{V, k, *V~~x, *V~~r, n}}
|
||||||
}
|
}
|
||||||
if (wT<=32) {
|
|
||||||
def elbytes = wT/8
|
|
||||||
specialize{2}
|
specialize{2}
|
||||||
if (wv <= tupsel{-1,rcsh_vals}) {
|
rep_const_shuffle_any(wv, wT/8, x, r, n)
|
||||||
ri := wv - tupsel{0,rcsh_vals}
|
|
||||||
shp:= *[32]i8~~rcsh_data + load{rcsh_offs,ri}
|
|
||||||
rep_const_shuffle_full(wv, elbytes, x, r, n*elbytes, shp)
|
|
||||||
} else {
|
|
||||||
rep_const_shuffle_partial4(wv, elbytes, x, r, n)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
assert{max_shuffle <= tupsel{0, fact_inds}}
|
|
||||||
each{specialize, basic_rep}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
kv := wv / vn
|
kv := wv / vn
|
||||||
@unroll (k from (max_shuffle/vn) to 4) {
|
@unroll (k from (max_shuffle/vn) to 4) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user