From 6e8c6d2e10583197abfdf9bc58bf5ee6f201e221 Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 14 Aug 2024 04:12:26 +0300 Subject: [PATCH] extract direct pointer version of bitwiden --- src/utils/bits.c | 102 ++++++++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 41 deletions(-) diff --git a/src/utils/bits.c b/src/utils/bits.c index f9f7a39c..1bf57b70 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -117,70 +117,90 @@ FORCE_INLINE void ab_add(ABState* state, u64 val, ux count) { // assumes bits pa } -static NOINLINE B zeroPadToCellBits0(B x, usz lr, usz cam, usz pcsz, usz ncsz) { // consumes; for now assumes ncsz is either a multiple of 64, or one of 8,16,32 - assert((ncsz&7) == 0 && RNK(x)>=1 && pcsz xcsz && ((rcsz&63) == 0 || rcsz==8 || rcsz==16 || rcsz==32)); + + if (rcsz<=32 && (xcsz&(xcsz-1)) == 0) { + if (xcsz==1) { + assert(rcsz==8 || rcsz==16 || rcsz==32); + COPY_TO_FROM(rp, rcsz==16? el_i16 : rcsz>16? el_i32 : el_i8, xp, el_bit, cam); + return; + } + if (xcsz==8) { + assert(rcsz==16 || rcsz==32); + COPY_TO_FROM(rp, rcsz==16? el_c16 : el_c32, xp, el_c8, cam); + return; + } + if (xcsz==16) { + assert(rcsz==32); + COPY_TO_FROM(rp, el_c32, xp, el_c16, cam); + return; + } } - if (lr==UR_MAX) thrM("Rank too large"); - u64* rp; - Arr* r = m_bitarrp(&rp, cam*ncsz); - usz* rsh = arr_shAlloc(r, lr+1); - shcpy(rsh, SH(x), lr); - rsh[lr] = ncsz; - if (PIA(r)==0) goto decG_ret; - u64* xp = tyany_ptr(x); - - // TODO widen 8/16-bit cells to 16/32 via cpyC(16|32)Arr - if (ncsz<=64 && (ncsz&(ncsz-1)) == 0) { - u64 tmsk = (1ull<>6; // previous full u64 count in cell - u64 msk = (1ull<<(pcsz&63))-1; + assert((rcsz&63) == 0 && rcsz-xcsz < 64 && (xcsz&63) != 0); + ux pfu64 = xcsz>>6; // previous full u64 count in cell + u64 msk = (1ull<<(xcsz&63))-1; for (ux i = 0; i < cam; i++) { - for (ux j = 0; j < pfu64; j++) rp[j] = rbuu64(xp, i*pcsz + j*64); - rp[pfu64] = rbuu64(xp, i*pcsz + pfu64*64) & msk; - rp+= ncsz>>6; + for (ux j = 0; j < pfu64; j++) rp64[j] = rbuu64(xp, i*xcsz + j*64); + rp64[pfu64] = rbuu64(xp, i*xcsz + pfu64*64) & msk; + rp64+= rcsz>>6; } } - decG_ret:; +} + + + +static NOINLINE B zeroPadToCellBits0(B x, usz lr, usz cam, usz pcsz, usz ncsz) { // consumes; for now assumes ncsz is either a multiple of 64, or one of 8,16,32 + assert((ncsz&7) == 0 && RNK(x)>=1 && pcsz 0) bitwiden(rp, ncsz, tyany_ptr(x), pcsz, cam); decG(x); return taga(r); }