diff --git a/src/builtins/select.c b/src/builtins/select.c index ba4675f1..589980b9 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -3,21 +3,25 @@ // First Cell is just a slice // Complications in Select mostly come from range checks and negative 𝕨 -// Atom 𝕨 and any rank 𝕩: slice -// Rank-1 𝕩: -// Empty 𝕨: no selection -// Small 𝕩 with Singeli: use shuffles -// Boolean 𝕨: use bit_sel for blend or similar -// Boolean 𝕩 and larger 𝕨: convert to i8, select, convert back -// Boolean 𝕩 otherwise: select/shift bytes, reversed for fast writing +// Atom or enclosed atom 𝕨 and rank-1 𝕩: make new array +// Atom or enclosed atom 𝕨 and high-rank 𝕩: slice +// Empty 𝕨: no selection +// Float or generic 𝕨: attempt to squeeze, go generic cell size path if stays float +// Boolean 𝕩 (cell size = 1 bit): +// 𝕨 larger than 𝕩: convert 𝕩 to i8, select, convert back +// Otherwise: select/shift bytes, reversed for fast writing // TRIED pext, doesn't seem faster (mask built with shifts anyway) -// SHOULD squeeze 𝕨 if not ≀i32 to get to optimized cases +// 𝕩 with cell sizes of 1, 2, 4, or 8 bytes: +// Small 𝕩 and i8 𝕨 with Singeli: use shuffles +// Boolean 𝕨: use bit_sel for blend or similar // Integer 𝕨 with Singeli: fused wrap, range-check, and gather // COULD try selecting from boolean with gather // COULD detect =xn) { badw=c; goto bad1; } cf_call(f, rm->a, ri, xp, c*f.mul); ri+= f.mul; } // TODO something better + case el_i8: for (; ia, ri, xp, c*f.mul); ri+= f.mul; } + case el_i16: for (; ia, ri, xp, c*f.mul); ri+= f.mul; } + case el_i32: for (; ia, ri, xp, c*f.mul); ri+= f.mul; } + } + + assert(!isVal(xf)); + r = a(mut_fv(rm)); + } else { + MUTG_INIT(rm); + for (; i < wia; i++) { + B cw = GetU(w, i); // assumed number from previous squeeze + usz c = WRAP(o2i64(cw), xn, { badw=o2fG(cw); goto bad1; }); + mut_copyG(rm, i*csz, x, csz*c, csz); + } + r = a(withFill(mut_fv(rm), xf)); } - r = a(withFill(mut_fv(rm), xf)); goto setsh; + + bad1:; + mut_pfree(rm, i*csz); + thrF("⊏: Indexing out-of-bounds (%fβˆŠπ•¨, %H≑≒𝕩)", badw, x); }