diff --git a/src/builtins/scan.c b/src/builtins/scan.c index 4db03f0f..68ea2a30 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -36,9 +36,21 @@ B scan_ne(u64 p, u64* xp, u64 ia) { return r; } +static B scan_or(B x, u64 ia) { + u64* xp = bitarr_ptr(x); + u64* rp; B r=m_bitarrv(&rp,ia); + usz n=BIT_N(ia); u64 xi; usz i=0; + while (if; @@ -78,13 +95,8 @@ B scan_c1(Md1D* d, B x) { B f = d->f; u8 rtid = v(f)->flags-1; if (xe==el_bit) { u64* xp=bitarr_ptr(x); - if (rtid==n_add) { - u64 xs = bit_sum(xp, ia); - if (xs>I32_MAX) goto base; - if (xs<=1) { if (xs==0) return x; goto bit_or; } - return FL_SET(scan_bit_sum(x, xp, ia, xs), fl_asc|fl_squoze); - } - if (rtid==n_or | rtid==n_ceil ) { bit_or:; u64* rp; B r=m_bitarrv(&rp,ia); usz n=BIT_N(ia); u64 xi; usz i=0; while(i8) { - return M1C1(scan, add, shift_ne(x, n, lw, 0)); + return scan_add_bool(shift_ne(x, n, lw, 0), n); } #define BRUTE(T) \ i##T* xp = xv; \