diff --git a/src/builtins/slash.c b/src/builtins/slash.c index 4d9baa95..a92f7878 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -131,34 +131,40 @@ B slash_c1(B t, B x) { u8 xe = TI(x,elType); if (xe==el_bit) { u64* xp = bitarr_ptr(x); - // Sparse method with CTZ - #if SINGELI && defined(__BMI2__) - if (xia>128 && xia<=32768 && s < xia/16) { - #else - if (xia<=128 || s < xia/2+(xia<=32768?xia/4:0)) { - #endif + if (xia > 32768) { usz q=xia%64; if (q) xp[xia/64] &= ((u64)1<xia-i) { + b = xia-i; + bs = s-(rq-rp); + } else { + bs = bit_sum(xp,b); + } + #if SINGELI && defined(__BMI2__) if (bs >= b/8+b/16) { bmipopc_1slash16(xp, buf, b); for (usz j=0; j= b/256) { + #else + if (bs >= b/2) { + for (usz ii=0; ii<(b+7)/8; ii++) { + u8 v = ((u8*)xp)[ii]; + i32* rs=rq; + for (usz k=0; k<8; k++) { *rs=i+8*ii+k; rs+=v&1; v>>=1; } + } + #endif + } else if (bs >= b/256) { // Branchless sparse for (usz j=0; j>=24; p=(u32)u&(top-1); rq[j]+=(3*top)|p; j+=POPC(p); u>>=24; @@ -170,7 +176,7 @@ B slash_c1(B t, B x) { rq[j] = 8*(t>>24) + CTZ((u32)t); t &= t-1; } - } else { + } else { // Branched very sparse for (usz ii=i/64, j=0; j128 && s < xia/16) { + #else + if (xia<=128 || s < xia/2) { + #endif + usz q=xia%64; if (q) xp[xia/64] &= ((u64)1<0 && !bitp_get(xp,xia-1)) xia--; + i32* rp = m_tyarrvO(&r, 4, s, t_i32arr, 4); u8* x8 = (u8*)xp; u8 q=xia%8; if (q) x8[xia/8] &= (1<