From 8331a05547a611298a398425f13e54fb5c9c76e6 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 2 Jun 2024 18:06:55 -0400 Subject: [PATCH] =?UTF-8?q?Boolean=20=E2=89=A0`=CB=98=20implementation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/scan.c | 7 +++--- src/singeli/src/scan.singeli | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/builtins/scan.c b/src/builtins/scan.c index 81d9cafe..c0e78ff4 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -335,12 +335,13 @@ B scan_rows_bit(Md1D* fd, B x) { #if SINGELI if (!v(fd->f)->flags) return bi_N; u8 rtid = v(fd->f)->flags-1; - if (rtid==n_and|rtid==n_or) { + if (rtid==n_and|rtid==n_or|rtid==n_ne) { usz *sh = SH(x); usz n = sh[0]; usz m = sh[1]; u64* xp = bitarr_ptr(x); u64* rp; B r = m_bitarrc(&rp, x); - if (rtid==n_and) si_scan_rows_and(xp, rp, n, m); - else si_scan_rows_or (xp, rp, n, m); + if (rtid==n_and) si_scan_rows_and(xp, rp, n, m); + else if (rtid==n_or ) si_scan_rows_or (xp, rp, n, m); + else si_scan_rows_ne (xp, rp, n, m); decG(x); return r; } if (rtid==n_add && SH(x)[1]<128) { diff --git a/src/singeli/src/scan.singeli b/src/singeli/src/scan.singeli index 3858c748..910d5e80 100644 --- a/src/singeli/src/scan.singeli +++ b/src/singeli/src/scan.singeli @@ -376,5 +376,50 @@ fn scan_rows_andor{id}(src:*u64, dst:*u64, n:usz, l:usz) : void = { } } +fn scan_rows_neq(x:*u64, r:*u64, n:usz, l:usz) : void = { + def scan_word = prefix_byshift{^, <<} + assert{l > 0} + nl := n*l + nw := cdiv{nl, 64} + if (l < 64) { + if ((l & (l-1)) == 0) { + m:u64 = (~u64~~0) / ((u64~~1 << l)-1) + @for (r, x over nw) { + s:= scan_word{x} + b:= s<<1 & m # last bit of previous row + r = s ^ (b<> d) / ((u64~~1 << l)-1) + m = m<>63) + m = m>>d | m<<(l-d) + } + } + } else { + i :usz = 0 # row bit index + iw:usz = 0 # starting word + c:u64 = 0 # carry + while (1) { + i+= l; ii := iw; iw = cdiv{i, 64} + scan_neq{}(c, x+ii, r+ii, promote{u64,iw-ii}) + if (i == nl) return{} + s:= load{r, iw-1} + q := i%64 + s^= -(s<<1 & u64~~1<0)) >> 63) + } + } +} + export{'si_scan_rows_and', scan_rows_andor{0}} export{'si_scan_rows_or', scan_rows_andor{1}} +export{'si_scan_rows_ne', scan_rows_neq}