From 447ce6163f61cbbc48962d3250f6d075a659b91e Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Wed, 19 Oct 2022 21:09:27 -0400 Subject: [PATCH] =?UTF-8?q?Introduce=20bit=5Fhas=20and=20use=20for=20?= =?UTF-8?q?=E2=88=A7=C2=B4,=20=E2=88=A8=C2=B4,=20and=20=F0=9D=95=A8?= =?UTF-8?q?=E2=88=8Abool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 8 ++++---- src/builtins/search.c | 19 ++++++++++++++----- src/core/numarr.h | 6 ++++++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 1b1e4152..0ec8e847 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -320,8 +320,8 @@ B fold_c1(Md1D* d, B x) { B f = d->f; u64* xp = bitarr_ptr(x); if (rtid==n_add) { B r = m_f64(bit_sum (xp, ia)); decG(x); return r; } if (rtid==n_sub) { B r = m_f64(bit_diff(xp, ia)); decG(x); return r; } - if (rtid==n_and | rtid==n_mul | rtid==n_floor) { bool r=1; for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; decG(x); return m_i32(r); } - if (rtid==n_or | rtid==n_ceil ) { bool r=0; for (usz i=0; i<(ia>>6); i++) if ( xp[i]){r=1;break;} if( bitp_l0(xp,ia))r=1; decG(x); return m_i32(r); } + if (rtid==n_and | rtid==n_mul | rtid==n_floor) { B r = m_i32(!bit_has(xp, ia, 0)); decG(x); return r; } + if (rtid==n_or | rtid==n_ceil ) { B r = m_i32( bit_has(xp, ia, 1)); decG(x); return r; } if (rtid==n_ne) { bool r=fold_ne(xp, ia) ; decG(x); return m_i32(r); } if (rtid==n_eq) { bool r=fold_ne(xp, ia) ^ (1&~ia); decG(x); return m_i32(r); } goto base; @@ -383,8 +383,8 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; if (rtid==n_add) { B r = m_f64(wi + bit_sum (xp, ia)); decG(x); return r; } if (rtid==n_sub) { B r = m_f64((ia&1?-wi:wi) + bit_diff(xp, ia)); decG(x); return r; } if (wi!=(wi&1)) goto base; - if (rtid==n_and | rtid==n_mul | rtid==n_floor) { bool r=wi; if ( r) { for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; } decG(x); return m_i32(r); } - if (rtid==n_or | rtid==n_ceil ) { bool r=wi; if (!r) { for (usz i=0; i<(ia>>6); i++) if ( xp[i]){r=1;break;} if( bitp_l0(xp,ia))r=1; } decG(x); return m_i32(r); } + if (rtid==n_and | rtid==n_mul | rtid==n_floor) { B r = m_i32(wi && !bit_has(xp, ia, 0)); decG(x); return r; } + if (rtid==n_or | rtid==n_ceil ) { B r = m_i32(wi || bit_has(xp, ia, 1)); decG(x); return r; } if (rtid==n_ne) { bool r=wi^fold_ne(xp, ia) ; decG(x); return m_i32(r); } if (rtid==n_eq) { bool r=wi^fold_ne(xp, ia) ^ (1&ia); decG(x); return m_i32(r); } goto base; diff --git a/src/builtins/search.c b/src/builtins/search.c index f82c67fe..1d1d9331 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -84,14 +84,23 @@ B memberOf_c2(B t, B w, B x) { many: { u8 we = TI(w,elType); usz wia = IA(w); u8 xe = TI(x,elType); usz xia = IA(x); + if (xia == 0) { Arr* ba=allZeroes(wia); arr_shVec(ba); r=taga(ba); decG(w); goto dec_x; } + #define WEQ(V) eq_c2(m_f64(0), inc(w), V) + if (xe==el_bit) { + u64* xp = bitarr_ptr(x); + u64 x0 = 1 & xp[0]; + r = WEQ(m_usz(x0)); + if (bit_has(xp, xia, !x0)) r = or_c2(m_f64(0), r, WEQ(m_usz(!x0))); + decG(w); goto dec_x; + } if (xia<=16 && wia>16 && we