diff --git a/src/builtins/slash.c b/src/builtins/slash.c index b2555a37..3d268fed 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -175,7 +175,7 @@ static void where_block_u16(u64* src, u16* dst, usz len, usz sum) { } } -static B compress_grouped(u64* wp, B x, usz wia, usz wsum, u8 xt) { +static B compress_grouped(u64* wp, B x, usz wia, usz wsum, u8 xt) { // expected to return a refcount-1 array (at least when rank≄1) B r; usz csz = arr_csz(x); u8 xl = arrTypeBitsLog(TY(x)); @@ -452,6 +452,7 @@ static B compress(B w, B x, usz wia, u8 xl, u8 xt) { usz q=(-j)%64; if (q) rp[j/64] = o>>q; break; } + #define COMPRESS_BLOCK_PREP(T, PREP) \ usz b = bsp_max; TALLOC(i16, buf, b); PREP; \ T* rp0=rp; \ @@ -476,25 +477,24 @@ static B compress(B w, B x, usz wia, u8 xl, u8 xt) { else { rp=m_tyarrv(&r,W/8,wsum,xt); COMPRESS_BLOCK(i##W); } \ } \ break; } + #if SINGELI - #define DO(W) \ - WITH_SPARSE(W, si_thresh_2slash##W, rp=m_tyarrv(&r,W/8,wsum,xt); si_2slash##W(wp, xp, rp, wia, wsum)) - case 3: DO(8) case 4: DO(16) case 5: DO(32) - case 6: if (TI(x,elType)!=el_B) { - DO(64) - } // else follows - #undef DO + #define DO(W) WITH_SPARSE(W, si_thresh_2slash##W, rp=m_tyarrv(&r,W/8,wsum,xt); si_2slash##W(wp, xp, rp, wia, wsum)) + case 3: DO(8) case 4: DO(16) case 5: DO(32) + case 6: if (TI(x,elType)!=el_B) { DO(64) } // else follows + #undef DO #else - case 3: WITH_SPARSE( 8, 2, rp=m_tyarrv(&r,1,wsum,xt); for (usz i=0; i=wia/8 && groups_lt(wp,wia, wia/16)) r = compress_grouped(wp, x, wia, wsum, xt); \ - else { T* xp=tyany_ptr(x); T* rp=m_tyarrv(&r,sizeof(T),wsum,xt); COMPRESS_BLOCK(T); } - case 5: BLOCK_OR_GROUPED(i32) break; - case 6: - if (TI(x,elType)!=el_B) { BLOCK_OR_GROUPED(u64) } - #undef BLOCK_OR_GROUPED + case 3: WITH_SPARSE( 8, 2, rp=m_tyarrv(&r,1,wsum,xt); for (usz i=0; i=wia/8 && groups_lt(wp,wia, wia/16)) r = compress_grouped(wp, x, wia, wsum, xt); \ + else { T* xp=tyany_ptr(x); T* rp=m_tyarrv(&r,sizeof(T),wsum,xt); COMPRESS_BLOCK(T); } + case 5: BLOCK_OR_GROUPED(i32) break; + case 6: + if (TI(x,elType)!=el_B) { BLOCK_OR_GROUPED(u64) } // else follows + #undef BLOCK_OR_GROUPED #endif + #undef WITH_SPARSE else { B xf = getFillR(x); @@ -516,9 +516,9 @@ static B compress(B w, B x, usz wia, u8 xl, u8 xt) { } ur xr = RNK(x); if (xr > 1) { - Arr* ra=a(r); SPRNK(ra,xr); - usz* sh = ra->sh = m_shArr(xr)->a; - sh[0] = PIA(ra); ra->ia *= arr_csz(x); + a(r)->ia*= arr_csz(x); + usz* sh = arr_shAlloc(a(r), xr); + sh[0] = wsum; shcpy(sh+1, SH(x)+1, xr-1); } return r; @@ -818,10 +818,10 @@ B slash_c2(B t, B w, B x) { atmW_maybesh:; if (xr > 1) { atmW_setsh:; - usz* rsh = m_shArr(xr)->a; + a(r)->ia = s*arr_csz(x); + usz* rsh = arr_shAlloc(a(r), xr); rsh[0] = s; shcpy(rsh+1, SH(x)+1, xr-1); - Arr* ra=a(r); SPRNK(ra,xr); ra->sh=rsh; ra->ia=s*arr_csz(x); } goto decX_ret; }