Pull out scan_add_bool() utility function from scan_c1()
This commit is contained in:
parent
d6029985e8
commit
ac7ff155d4
@ -36,9 +36,21 @@ B scan_ne(u64 p, u64* xp, u64 ia) {
|
|||||||
return r;
|
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 (i<n) if ((xi=vg_rand(xp[i]))!=0) { rp[i] = -(xi&-xi); i++; while(i<n) rp[i++] = ~0LL; break; } else rp[i++]=0;
|
||||||
|
decG(x); return FL_SET(r, fl_asc|fl_squoze);
|
||||||
|
}
|
||||||
|
|
||||||
B slash_c1(B f, B x);
|
B slash_c1(B f, B x);
|
||||||
B scan_bit_sum(B x, u64* xp, u64 ia, u64 xs) { // consumes x
|
B scan_add_bool(B x, u64 ia) { // consumes x
|
||||||
u8 re = xs<=I8_MAX? el_i8 : xs<=I16_MAX? el_i16 : el_i32;
|
u64* xp = bitarr_ptr(x);
|
||||||
|
u64 xs = bit_sum(xp, ia);
|
||||||
|
if (xs<=1) return xs==0? x : scan_or(x, ia);
|
||||||
|
B r;
|
||||||
|
u8 re = xs<=I8_MAX? el_i8 : xs<=I16_MAX? el_i16 : xs<=I32_MAX? el_i32 : el_f64;
|
||||||
if (xs < ia/128) {
|
if (xs < ia/128) {
|
||||||
B ones = slash_c1(m_f64(0), x);
|
B ones = slash_c1(m_f64(0), x);
|
||||||
MAKE_MUT(r0, ia) mut_init(r0, re); MUTG_INIT(r0);
|
MAKE_MUT(r0, ia) mut_init(r0, re); MUTG_INIT(r0);
|
||||||
@ -46,25 +58,30 @@ B scan_bit_sum(B x, u64* xp, u64 ia, u64 xs) { // consumes x
|
|||||||
usz ri = 0;
|
usz ri = 0;
|
||||||
for (usz i = 0; i < xs; i++) {
|
for (usz i = 0; i < xs; i++) {
|
||||||
usz e = o2s(GetU(ones, i));
|
usz e = o2s(GetU(ones, i));
|
||||||
mut_fillG(r0, ri, m_i32(i), e-ri);
|
mut_fillG(r0, ri, m_usz(i), e-ri);
|
||||||
ri = e;
|
ri = e;
|
||||||
}
|
}
|
||||||
if (ri<ia) mut_fillG(r0, ri, m_i32(xs), ia-ri);
|
if (ri<ia) mut_fillG(r0, ri, m_usz(xs), ia-ri);
|
||||||
decG(ones);
|
decG(ones);
|
||||||
return mut_fv(r0);
|
r = mut_fv(r0);
|
||||||
}
|
} else {
|
||||||
B r;
|
|
||||||
void* rp = m_tyarrv(&r, elWidth(re), ia, el2t(re));
|
void* rp = m_tyarrv(&r, elWidth(re), ia, el2t(re));
|
||||||
|
#define SUM_BITWISE(T) { T c=0; for (usz i=0; i<ia; i++) { c+= bitp_get(xp,i); ((T*)rp)[i]=c; } }
|
||||||
#if SINGELI
|
#if SINGELI
|
||||||
#define SUM(W,T) avx2_bcs##W(xp, rp, ia);
|
#define SUM(W,T) avx2_bcs##W(xp, rp, ia);
|
||||||
#else
|
#else
|
||||||
#define SUM(W,T) { T c=0; for (usz i=0; i<ia; i++) { c+= bitp_get(xp,i); ((T*)rp)[i]=c; } }
|
#define SUM(W,T) SUM_BITWISE(T)
|
||||||
#endif
|
#endif
|
||||||
#define CASE(W) case el_i##W: SUM(W, i##W) break;
|
#define CASE(W) case el_i##W: SUM(W, i##W) break;
|
||||||
switch (re) { default:UD; CASE(8) CASE(16) CASE(32) }
|
switch (re) { default:UD;
|
||||||
|
CASE(8) CASE(16) CASE(32) case el_f64: SUM_BITWISE(f64) break;
|
||||||
|
}
|
||||||
#undef CASE
|
#undef CASE
|
||||||
#undef SUM
|
#undef SUM
|
||||||
decG(x); return r;
|
#undef SUM_BITWISE
|
||||||
|
decG(x);
|
||||||
|
}
|
||||||
|
return FL_SET(r, fl_asc|fl_squoze);
|
||||||
}
|
}
|
||||||
|
|
||||||
B scan_c1(Md1D* d, B x) { B f = d->f;
|
B scan_c1(Md1D* d, B x) { B f = d->f;
|
||||||
@ -78,13 +95,8 @@ B scan_c1(Md1D* d, B x) { B f = d->f;
|
|||||||
u8 rtid = v(f)->flags-1;
|
u8 rtid = v(f)->flags-1;
|
||||||
if (xe==el_bit) {
|
if (xe==el_bit) {
|
||||||
u64* xp=bitarr_ptr(x);
|
u64* xp=bitarr_ptr(x);
|
||||||
if (rtid==n_add) {
|
if (rtid==n_add ) return scan_add_bool(x, ia);
|
||||||
u64 xs = bit_sum(xp, ia);
|
if (rtid==n_or | rtid==n_ceil ) return scan_or(x, 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(i<n) if ((xi= vg_rand(xp[i]))!=0) { rp[i] = -(xi&-xi) ; i++; while(i<n) rp[i++] = ~0LL; break; } else rp[i++]= 0 ; decG(x); return r; }
|
|
||||||
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* rp; B r=m_bitarrv(&rp,ia); usz n=BIT_N(ia); u64 xi; usz i=0; while(i<n) if ((xi=~vg_rand(xp[i]))!=0) { rp[i] = (xi&-xi)-1; i++; while(i<n) rp[i++] = 0 ; break; } else rp[i++]=~0LL; decG(x); return r; }
|
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* rp; B r=m_bitarrv(&rp,ia); usz n=BIT_N(ia); u64 xi; usz i=0; while(i<n) if ((xi=~vg_rand(xp[i]))!=0) { rp[i] = (xi&-xi)-1; i++; while(i<n) rp[i++] = 0 ; break; } else rp[i++]=~0LL; decG(x); return r; }
|
||||||
if (rtid==n_ne) { B r=scan_ne(0, xp, ia); decG(x); return r; }
|
if (rtid==n_ne) { B r=scan_ne(0, xp, ia); decG(x); return r; }
|
||||||
if (rtid==n_lt) {
|
if (rtid==n_lt) {
|
||||||
|
|||||||
@ -42,6 +42,7 @@ extern B scan_c1(Md1D*, B);
|
|||||||
extern B ud_c1(B, B);
|
extern B ud_c1(B, B);
|
||||||
extern B sub_c2(B, B, B);
|
extern B sub_c2(B, B, B);
|
||||||
extern B mul_c2(B, B, B);
|
extern B mul_c2(B, B, B);
|
||||||
|
extern B scan_add_bool(B x, u64 ia);
|
||||||
|
|
||||||
// These hashes are stored in tables and must be invertible!
|
// These hashes are stored in tables and must be invertible!
|
||||||
#if defined(__SSE4_2__)
|
#if defined(__SSE4_2__)
|
||||||
@ -419,7 +420,7 @@ B indexOf_c1(B t, B x) {
|
|||||||
return C1(shape, r);
|
return C1(shape, r);
|
||||||
}
|
}
|
||||||
if (use_sorted(x, lw) && n>8) {
|
if (use_sorted(x, lw) && n>8) {
|
||||||
return M1C1(scan, add, shift_ne(x, n, lw, 0));
|
return scan_add_bool(shift_ne(x, n, lw, 0), n);
|
||||||
}
|
}
|
||||||
#define BRUTE(T) \
|
#define BRUTE(T) \
|
||||||
i##T* xp = xv; \
|
i##T* xp = xv; \
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user