diff --git a/src/builtins/scan.c b/src/builtins/scan.c index 128aa726..5e63e8c5 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -70,7 +70,7 @@ B mul_c2(B, B, B); B scan_ne(B x, u64 p, u64 ia) { // consumes x u64* xp = bitany_ptr(x); - u64* rp; B r=m_bitarrv(&rp,ia); + u64* rp; B r=m_bitarrc(&rp,x); #if SINGELI si_scan_ne(p, xp, rp, BIT_N(ia)); #if USE_VALGRIND @@ -97,14 +97,14 @@ B scan_eq(B x, u64 ia) { // consumes x static B scan_or(B x, u64 ia) { // consumes x u64* xp = bitany_ptr(x); - u64* rp; B r=m_bitarrv(&rp,ia); + u64* rp; B r=m_bitarrc(&rp,x); usz n=BIT_N(ia); u64 xi; usz i=0; while (i,MIN,or ,asc) } #define MM2_ICASE(T,N,C,I) \ case el_##T : { \ if (wv!=(T)wv) { if (wv C 0) { r=C2(shape,m_f64(ia),w); break; } else wv=I; } \ - T* xp=T##any_ptr(x); T* rp; r=m_##T##arrv(&rp, ia); MINMAX_SCAN(T,N,C,wv); \ + T* xp=T##any_ptr(x); T* rp; r=m_##T##arrc(&rp, x); MINMAX_SCAN(T,N,C,wv); \ break; } #define MINMAX2(NAME,C,INIT,BIT,BI,ORD) \ i32 wv=0; if (q_i32(w)) { wv=o2fG(w); } else { x=taga(cpyF64Arr(x)); xe=el_f64; } \ @@ -195,7 +195,7 @@ SHOULD_INLINE B scan2_max_num(B w, B x, u8 xe, usz ia) { MINMAX2(max,>,MIN,or ,0 static B scan_lt(B x, u64 p, usz ia) { u64* xp = bitany_ptr(x); - u64* rp; B r=m_bitarrv(&rp,ia); usz n=BIT_N(ia); + u64* rp; B r=m_bitarrc(&rp,x); usz n=BIT_N(ia); u64 m = 0x5555555555555555; for (usz i=0; if; Arr* r = TI(x,slice)(x, 0, csz); return C2(shape, s, taga(r)); } - if (!(xr==1 && xe<=el_f64)) goto base; + if (xe > el_f64) goto base; + if (xr!=1 && arr_csz(x)!=1) goto base; if (xe==el_bit) switch (rtid) { default: goto base; case n_add: return scan_add_bool(x, ia); // + @@ -278,7 +279,7 @@ B scan_c1(Md1D* d, B x) { B f = d->f; if (!elInt(xe)) goto base; f64 x0 = o2fG(IGetU(x,0)); if (!q_fbit(x0)) goto base; - u64* rp; B r = m_bitarrv(&rp, ia); + u64* rp; B r = m_bitarrc(&rp, x); bool c = x0; rp[0] = c; if (xe==el_i8 ) { i8* xp=i8any_ptr (x); for (usz i=1; if; u8 rtid = RTID(f); if (rtid==n_rtack) { dec(w); return x; } if (rtid==n_ltack) return C2(shape, C1(fne, x), w); - if (!(xr==1 && elNum(xe) && xe<=el_f64)) goto base; + if (!(elNum(xe) && xe<=el_f64)) goto base; + if (xr!=1 && arr_csz(x)!=1) goto base; if (!isF64(w)) goto base; if (rtid==n_floor) return scan2_min_num(w, x, xe, ia); // ⌊ @@ -350,7 +352,7 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f; if (xe==el_bit) return scan_ne(x, -(u64)(wBit? o2bG(w) : 1&~*bitany_ptr(x)), ia); if (!wBit || !elInt(xe)) goto base; bool c = o2bG(w); - u64* rp; B r = m_bitarrv(&rp, ia); + u64* rp; B r = m_bitarrc(&rp, x); if (xe==el_i8 ) { i8* xp=i8any_ptr (x); for (usz i=0; i