diff --git a/src/singeli/src/select.singeli b/src/singeli/src/select.singeli index a2fe4dbe..ff8a3a7a 100644 --- a/src/singeli/src/select.singeli +++ b/src/singeli/src/select.singeli @@ -23,18 +23,36 @@ select{rw, TI, TD}(w0:*void, x0:*void, r0:*void, wl:u64, xl:u64) : u1 = { x:= *TD ~~ x0 r:= *TD ~~ r0 + def wrap{cw0, VI,xlf} = cw0 + (xlf & VI~~(cw0 { - cw0:= loadBatch{w, i, VI} - cw1:= cw0+xlf - cw:= blendF{cw0, cw1, cw0 { + cw:= wrap{loadBatch{w, i, VI}, VI,xlf} if (any{M{ty_u{cw} >= ty_u{xlf}}}) return{0} - storeBatch{r, i, VD~~sel{[16]i8, xd, cw}, M} + is := (if (wd>wi) i< se{w*2, VI~~c, o}, + unpackQ{c2, c2+broadcast{VI,1}}, + 2*o + iota{2} + } + } + def se{w==wd, c, o} = { + io:= is+o + got:= VD~~sel{[16]i8, xd, c} + def s{M} = storeBatch{r, io, got, M} + if (wd==wi or not M{0}) s{M} + else if (io*rd+rd <= wl) s{maskNone} + else if (io*rd < wl) s{maskAfter{wl & (rd-1)}} + } + se{wi, cw, 0} }} return{1} } @@ -47,9 +65,7 @@ select{rw, TI, TD}(w0:*void, x0:*void, r0:*void, wl:u64, xl:u64) : u1 = { def xlf = broadcast{VI, cast_i{TIE, xl}} maskedLoop{bulk, wl, {i, M} => { - cw0:= loadBatch{w, i, VI} - cw1:= cw0+xlf - cw:= blendF{cw0, cw1, cw0= ty_u{xlf}}}) return{0} got:= gather{broadcast{VD,0}, x, cw, M} if (TDE!=TD) got&= broadcast{VD, (1<