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 = {
|
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 TIE = i32
|
||||||
def TDE = tern{width{TD}<32, u32, TD}
|
def TDE = tern{width{TD}<32, u32, TD}
|
||||||
def bulk = rw / width{TDE}
|
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 VD = [bulk]TDE
|
||||||
def xlf = broadcast{VI, cast_i{TIE, xl}}
|
def xlf = broadcast{VI, cast_i{TIE, xl}}
|
||||||
|
|
||||||
w:= *TI ~~ w0
|
|
||||||
x:= *TD ~~ x0
|
|
||||||
r:= *TD ~~ r0
|
|
||||||
|
|
||||||
maskedLoop{bulk, wl, {i, M} => {
|
maskedLoop{bulk, wl, {i, M} => {
|
||||||
cw0:= loadBatch{w, i, VI}
|
cw0:= loadBatch{w, i, VI}
|
||||||
cw1:= cw0+xlf
|
cw1:= cw0+xlf
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user