1-byte select with <=16 elements using shuffle

This commit is contained in:
Marshall Lochbaum 2022-11-27 21:03:58 -05:00
parent e09d555eba
commit 6639c17b81

View File

@ -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