diff --git a/src/builtins/group.c b/src/builtins/group.c index 7c951cb0..30565664 100644 --- a/src/builtins/group.c +++ b/src/builtins/group.c @@ -13,8 +13,8 @@ // If ∧´1↓»⊸<𝕨, that is, ∧⊸≡𝕨, each result array is a slice of 𝕩 // COULD use slice types; seems dangerous--when will they be freed? // Remaining cases copy cells from 𝕩 individually -// CPU-sized cells handled quickly -// SHOULD use bit ops for 1-bit cells +// Converts 𝕨 to i32, COULD handle smaller types +// CPU-sized cells handled quickly, 1-bit with bitp_get/set // SHOULD use memcpy and bit_cpy for other sizes #include "../core.h" @@ -158,7 +158,7 @@ static B group_simple(B w, B x, ur xr, usz wia, usz xia, usz* xsh, u8 we) { } // Many ¯1s: filter out, then continue - if (xia>32 && neg>xia/4+xia/8) { + if (xia>32 && neg>(bits?0:xia/4)+xia/8) { if (wia>xia) w = take_c2(m_f64(0), m_f64(xia), w); B m = ne_c2(m_f64(0), m_f64(-1), inc(w)); w = slash_c2(m_f64(0), inc(m), w); @@ -200,6 +200,13 @@ static B group_simple(B w, B x, ur xr, usz wia, usz xia, usz* xsh, u8 we) { case 2: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u32*)tyarr_ptr(rp[n]))[pos[n]++] = ((u32*)xp)[i]; } break; case 3: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u64*)tyarr_ptr(rp[n]))[pos[n]++] = ((u64*)xp)[i]; } break; } + } else if (xl == 0) { // 1-bit cells + u64* xp = bitarr_ptr(x); + allocBitGroups(rp, ria, z, xr, xsh, len, width); + for (usz i = 0; i < xia; i++) { + bool b = bitp_get(xp,i); i32 n = wp[i]; + if (n>=0) bitp_set(bitarr_ptr(rp[n]), pos[n]++, b); + } } else { // Generic case for (usz i = 0; i < ria; i++) { usz l = len[i];