From e898a81d68899ab434028087225aed09df63d898 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Fri, 7 Mar 2025 18:17:17 -0500 Subject: [PATCH] =?UTF-8?q?Use=20a=20possibly-overlapping=20word=20and=20c?= =?UTF-8?q?onstant-length=20loop=20in=20k/bool,=20like=20=E2=8A=A3`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/slash.c | 24 +++++++++++++++++++----- src/singeli/src/replicate.singeli | 17 +++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/builtins/slash.c b/src/builtins/slash.c index 94378e12..8827153a 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -782,13 +782,27 @@ B slash_c2(B t, B w, B x) { u64* rp; r = m_bitarrv(&rp, s); #if SINGELI_AVX2 if (wv <= 256) si_constrep_bool(wv, xp, rp, s); - else #elif SINGELI - if (wv <= 64) si_constrep_bool(wv, xp, rp, s); - else + if (wv <= 128) si_constrep_bool(wv, xp, rp, s); + #else + if (wv <= 64) { BOOL_REP_XOR_SCAN(wv) } #endif - if (wv <= 256) { BOOL_REP_XOR_SCAN(wv) } - else { BOOL_REP_OVER(wv, xlen) } + else { + // Like BOOL_REP_OVER but predictable + u64 ri=0, c=0; usz j=0; + usz n=wv/64-1; + for (usz i = 0; i < xlen; i++) { + u64 v = -(1 & xp[i/64]>>(i%64)); + u64 r0 = c ^ ((v^c) << (ri%64)); + c = v; + ri += wv; usz e = ri/64; + rp[e-1] = v; // This allows the loop to be constant-length + rp[j] = r0; + for (usz k=0; k= 64) { + # Identical to the non-Singeli case for large wv + # but we assume n==0 and drop the loop + assert{wv < 128} + i:usz = 0 + ri:usz = 0; j:usz = 0 # Bit index in r; ri/64 + c:u64 = 0 + while (j < nw-1) { # e<=j+2 below, so e-1>(i%64)); ++i + r0:= c ^ ((v^c) << (ri%64)) + c = v + ri+= wv; e:= ri/64 + store{r, e-1, c} + store{r, j, r0} + j = e + } + if (ri%64 != 0) store{r, j, c} } else { rep_const_bool_odd{wv, x, r, nw} }