1-byte select with <=16 elements using shuffle
This commit is contained in:
parent
e09d555eba
commit
6639c17b81
@ -19,6 +19,26 @@ def gather{def:T, b:B, idx:[4]i32, M & w256{T,64}} = {
|
||||
}
|
||||
|
||||
select{rw, TI, TD}(w0:*void, x0:*void, r0:*void, wl:u64, xl:u64) : u1 = {
|
||||
w:= *TI ~~ w0
|
||||
x:= *TD ~~ x0
|
||||
r:= *TD ~~ r0
|
||||
|
||||
def wd = width{TD}
|
||||
if (width{TI}==8 and wd==8 and xl*wd<=128) {
|
||||
def VI = [32]TI
|
||||
def VD = [rw/wd]TD
|
||||
def xlf = broadcast{VI, cast_i{TI, xl}}
|
||||
xd := shuf{[4]u64, load{*VD~~x}, 4b1010}
|
||||
maskedLoop{rw/8, wl, {i, M} => {
|
||||
cw0:= loadBatch{w, i, VI}
|
||||
cw1:= cw0+xlf
|
||||
cw:= blendF{cw0, cw1, cw0<broadcast{VI, 0}}
|
||||
if (any{M{ty_u{cw} >= ty_u{xlf}}}) return{0}
|
||||
storeBatch{r, i, VD~~sel{[16]i8, xd, cw}, M}
|
||||
}}
|
||||
return{1}
|
||||
}
|
||||
|
||||
def TIE = i32
|
||||
def TDE = tern{width{TD}<32, u32, TD}
|
||||
def bulk = rw / width{TDE}
|
||||
@ -26,10 +46,6 @@ select{rw, TI, TD}(w0:*void, x0:*void, r0:*void, wl:u64, xl:u64) : u1 = {
|
||||
def VD = [bulk]TDE
|
||||
def xlf = broadcast{VI, cast_i{TIE, xl}}
|
||||
|
||||
w:= *TI ~~ w0
|
||||
x:= *TD ~~ x0
|
||||
r:= *TD ~~ r0
|
||||
|
||||
maskedLoop{bulk, wl, {i, M} => {
|
||||
cw0:= loadBatch{w, i, VI}
|
||||
cw1:= cw0+xlf
|
||||
|
||||
Loading…
Reference in New Issue
Block a user