diff --git a/src/builtins/slash.c b/src/builtins/slash.c index 1eda65be..8b415676 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -183,13 +183,13 @@ static B compress_grouped(u64* wp, B x, usz wia, usz wsum, u8 xt) { usz csz = arr_csz(x); u8 xl = arrTypeBitsLog(TY(x)); #define COMPRESS_GROUP(CPY) \ - u64 ri = 0; \ - u64 wv = wp[0]; usz i = 0, wn = (wia-1)/64+1; \ - for (u64 e=wsum*width; ri < e; ) { \ - while (wv== 0) wv=wp[++i]; usz i0=64*i+CTZ( wv); wv|=wv-1; \ - while (wv==-(u64)1) wv=++i0 || csz%8==0) { // Full bytes u64 width = xl==0 ? csz/8 : csz << (xl-3); @@ -474,7 +474,7 @@ B slash_c1(B t, B x) { for (usz i=k; i el_i32) { w = any_squeeze(w); we = TI(w,elType); } + if (!elInt(we)) { + w=any_squeeze(w); we=TI(w,elType); + if (!elInt(we)) goto slow; + } if (we==el_bit) { wbool: - B r = compress(w, x, wia, xl, xt); - decG(w); decG(x); return r; + r = compress(w, x, wia, xl, xt); + goto decWX_ret; } - if (xl > 6 || (xl < 3 && xl != 0)) goto base; + if (xl>6 || (xl<3 && xl!=0)) goto base; u64 s = usum(w); - if (we!=el_bit && s<=wia) { - w = num_squeeze(w); we = TI(w,elType); + if (s<=wia) { + w=num_squeezeChk(w); we=TI(w,elType); if (we==el_bit) goto wbool; } - - if (RARE(we>el_i32 || TI(x,elType)==el_B)) { // Slow case + + if (RARE(TI(x,elType)==el_B)) { // Slow case + slow: if (xr > 1) goto base; SLOW2("𝕨/𝕩", w, x); B xf = getFillQ(x); - u64 ria = usum(w); - if (ria>=USZ_MAX) thrOOM(); - M_HARR(r, ria) SGetU(w) SGetU(x) + MAKE_MUT(r0, s) mut_init(r0, el_B); MUTG_INIT(r0); + SGetU(w) SGetU(x) + usz ri = 0; for (usz i = 0; i < wia; i++) { usz c = o2s(GetU(w, i)); if (c) { - B cx = incBy(GetU(x, i), c); - for (usz j = 0; RARE(j < c); j++) HARR_ADDA(r, cx); + mut_fillG(r0, ri, GetU(x, i), c); + ri+= c; } } - decG(w); decG(x); - return withFill(HARR_FV(r), xf); + r = withFill(mut_fv(r0), xf); + decWX_ret: decG(w); + decX_ret: decG(x); + return r; } - - B r; + // Make shape if needed; all cases below use it usz* rsh = NULL; if (xr > 1) { @@ -571,11 +577,11 @@ B slash_c2(B t, B w, B x) { rp[ij/64]^=(-(xx&1))<<(ij%64); ij+=wp[j]; \ } \ for (usz i=k/64; i>63); \ - if (e==s) break; k=e; \ + if (e==s) {break;} k=e; \ } - if (we == el_i8 ) { SPARSE_REP(i8 ); } - else if (we == el_i16) { SPARSE_REP(i16); } - else { SPARSE_REP(i32); } + if (we==el_i8 ) { SPARSE_REP(i8 ); } + else if (we==el_i16) { SPARSE_REP(i16); } + else { SPARSE_REP(i32); } #undef SPARSE_REP } else { if (we < el_i32) w = taga(cpyI32Arr(w)); @@ -609,7 +615,7 @@ B slash_c2(B t, B w, B x) { for (usz i=k; i