From 6639c17b8191c0aacf1a553286acaa38dd125f14 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 27 Nov 2022 21:03:58 -0500 Subject: [PATCH] 1-byte select with <=16 elements using shuffle --- src/singeli/src/select.singeli | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/singeli/src/select.singeli b/src/singeli/src/select.singeli index 5ee83680..a2fe4dbe 100644 --- a/src/singeli/src/select.singeli +++ b/src/singeli/src/select.singeli @@ -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= 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