From bb3ecdca6ab2dc765e9e2908ade9b0102ed2c369 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 10 Sep 2022 09:12:16 -0400 Subject: [PATCH] Sparse Where --- src/builtins/sfns.c | 31 +++++++++++++++++++++++-------- src/h.h | 1 + 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 1079734e..297e228b 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -444,9 +444,23 @@ B slash_c1(B t, B x) { } B r; u8 xe = TI(x,elType); - #if SINGELI && defined(__BMI2__) if (xe==el_bit) { u64* xp = bitarr_ptr(x); + // Sparse method with CTZ + #if SINGELI && defined(__BMI2__) + if (xia>128 && s < xia/8+(xia<=32768?xia/4:0)) { + #else + if (xia<=128 || s < xia/2+(xia<=32768?xia/4:0)) { + #endif + usz q=xia%64; if (q) xp[xia/64] &= ((u64)1<0 && !bitp_get(xp,xia-1)) xia--; u8* x8 = (u8*)xp; u8 q=xia%8; if (q) x8[xia/8] &= (1<>=1; } } - } else if (xe==el_i8) { + } + #endif + } else { + i32* rp; r = m_i32arrv(&rp, s); + if (xe==el_i8) { i8* xp = i8any_ptr(x); while (xia>0 && !xp[xia-1]) xia--; for (u64 i = 0; i < xia; i++) { diff --git a/src/h.h b/src/h.h index 4afb5a87..7fb6509e 100644 --- a/src/h.h +++ b/src/h.h @@ -130,6 +130,7 @@ typedef double f64; #define NORETURN __attribute__((noreturn)) #define AUTO __auto_type #define CLZ(X) __builtin_clzll(X) +#define CTZ(X) __builtin_ctzll(X) #define POPC(X) __builtin_popcountll(X) #define LIKELY(X) __builtin_expect(X,1) #define RARE(X) __builtin_expect(X,0)