From 4950506c72da7aae0f2ddd45be744df9c425cf38 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 13 Aug 2022 13:34:01 -0400 Subject: [PATCH 1/7] Separate boolean fold and scan code from other special cases to handle aliases better --- src/builtins/md1.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index f8b504c4..703731bc 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -142,14 +142,19 @@ B scan_c1(Md1D* d, B x) { B f = d->f; u8 xe = TI(x,elType); if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; - if (rtid==n_add) { // + - if (xe==el_bit && iaf; if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=I32_MIN; for (usz i=0; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } } if (rtid==n_ne) { // ≠ - if (xe==el_bit) return scan_ne(0, x, ia); f64 x0 = IGetU(x,0).f; if (x0!=0 && x0!=1) goto base; if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; if; if (xr==1 && q_i32(w) && xeflags) { u8 rtid = v(f)->flags-1; i32 wv = o2iu(w); + if (xe==el_bit) { + if (rtid==n_add) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; if; } if (rtid==n_ne) { // ≠ if (!q_ibit(wv)) goto base; bool c=wv; - if (xe==el_bit) return scan_ne(-(u64)wv, x, ia); if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp, ia); for (usz i=0; if; u8 xe = TI(x,elType); if (isFun(f) && v(f)->flags && xe<=el_f64) { u8 rtid = v(f)->flags-1; + if (xe==el_bit) { + if (rtid==n_add) { B r = m_f64(bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } + if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* xp = bitarr_ptr(x); 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 ) { u64* xp = bitarr_ptr(x); 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); } + goto base; + } if (rtid==n_add) { // + - if (xe==el_bit) { B r = m_f64(bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=0; for (usz i=0; i>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; decG(x);return m_i32(r); } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=1; for (usz i=0; if; if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=I32_MIN; for (usz i=0; ic) c=xp[i]; decG(x); return m_i32(c); } } if (rtid==n_or) { // ∨ - if (xe==el_bit) { u64* xp = bitarr_ptr(x); 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 (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool r=0; for (usz i=0; if; if (q_i32(w) && isFun(f) && v(f)->flags && xeflags-1; + if (xe==el_bit) { + if (rtid==n_add) { B r = m_f64(wi + bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } + if (wi!=(wi&1)) goto base; + if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* xp = bitarr_ptr(x); 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 ) { u64* xp = bitarr_ptr(x); 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); } + goto base; + } if (rtid==n_add) { // + - if (xe==el_bit) { B r = m_f64(wi + bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=wi; for (usz i=0; i>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; } decG(x); return m_i32(r); } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; if; if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; ic) c=xp[i]; decG(x); return m_i32(c); } } if (rtid==n_or && (wi&1)==wi) { // ∨ - if (xe==el_bit) { u64* xp = bitarr_ptr(x); 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 (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool q=wi; for (usz i=0; i Date: Sat, 13 Aug 2022 13:45:56 -0400 Subject: [PATCH 2/7] =?UTF-8?q?Fast=20boolean=20-=C2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 703731bc..256e162b 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -121,6 +121,14 @@ B scan_ne(u64 p, B x, u64 ia) { decG(x); return r; } +static i64 bit_diff(u64* x, u64 am) { + i64 r = 0; + u64 a = 0xAAAAAAAAAAAAAAAA; + for (u64 i = 0; i < (am>>6); i++) r+= POPC(x[i]^a); + if (am&63) r+= POPC((x[am>>6]^a)<<(64-am & 63)); + return r - (i64)(am/2); +} + #if SINGELI #pragma GCC diagnostic push @@ -269,7 +277,8 @@ B fold_c1(Md1D* d, B x) { B f = d->f; if (isFun(f) && v(f)->flags && xe<=el_f64) { u8 rtid = v(f)->flags-1; if (xe==el_bit) { - if (rtid==n_add) { B r = m_f64(bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } + if (rtid==n_add) { B r = m_f64(bit_sum (bitarr_ptr(x), ia)); decG(x); return r; } + if (rtid==n_sub) { B r = m_f64(bit_diff(bitarr_ptr(x), ia)); decG(x); return r; } if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* xp = bitarr_ptr(x); 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 ) { u64* xp = bitarr_ptr(x); 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); } goto base; @@ -327,7 +336,8 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; i32 wi = o2iu(w); u8 rtid = v(f)->flags-1; if (xe==el_bit) { - if (rtid==n_add) { B r = m_f64(wi + bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } + if (rtid==n_add) { B r = m_f64(wi + bit_sum (bitarr_ptr(x), ia)); decG(x); return r; } + if (rtid==n_sub) { B r = m_f64((ia&1?-wi:wi) + bit_diff(bitarr_ptr(x), ia)); decG(x); return r; } if (wi!=(wi&1)) goto base; if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* xp = bitarr_ptr(x); 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 ) { u64* xp = bitarr_ptr(x); 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); } From f406b05303ce5aacb8253f639f3be883725c1666 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 13 Aug 2022 14:05:37 -0400 Subject: [PATCH 3/7] =?UTF-8?q?Fill=20boolean=20scan=20gaps:=20=E2=88=A8`?= =?UTF-8?q?=20and=20dyadic=20int=E2=89=A0`bool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 256e162b..2e09fa0f 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -158,7 +158,8 @@ B scan_c1(Md1D* d, B x) { B f = d->f; i32 c=0; for (usz i=0; if; i32 wv = o2iu(w); if (xe==el_bit) { if (rtid==n_add) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; i Date: Sat, 13 Aug 2022 14:21:30 -0400 Subject: [PATCH 4/7] Lift out bitarr_ptr calls --- src/builtins/md1.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 2e09fa0f..ebabdb95 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -108,8 +108,8 @@ B each_c2(Md1D* d, B w, B x) { B f = d->f; return homFil2(f, eachd(f, w, x), wf, xf); } -B scan_ne(u64 p, B x, u64 ia) { - u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); +B scan_ne(u64 p, u64* xp, u64 ia) { + u64* rp; B r=m_bitarrv(&rp,ia); for (usz i = 0; i < BIT_N(ia); i++) { u64 c = xp[i]; u64 r = c ^ (c<<1); @@ -118,7 +118,7 @@ B scan_ne(u64 p, B x, u64 ia) { rp[i] = r; p = -(r>>63); // repeat sign bit } - decG(x); return r; + return r; } static i64 bit_diff(u64* x, u64 am) { @@ -151,16 +151,17 @@ B scan_c1(Md1D* d, B x) { B f = d->f; if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; if (xe==el_bit) { - if (rtid==n_add && iaf; u8 rtid = v(f)->flags-1; i32 wv = o2iu(w); if (xe==el_bit) { - if (rtid==n_add) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; if; if (isFun(f) && v(f)->flags && xe<=el_f64) { u8 rtid = v(f)->flags-1; if (xe==el_bit) { - if (rtid==n_add) { B r = m_f64(bit_sum (bitarr_ptr(x), ia)); decG(x); return r; } - if (rtid==n_sub) { B r = m_f64(bit_diff(bitarr_ptr(x), ia)); decG(x); return r; } - if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* xp = bitarr_ptr(x); 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 ) { u64* xp = bitarr_ptr(x); 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); } + 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); } goto base; } if (rtid==n_add) { // + @@ -336,11 +339,12 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; i32 wi = o2iu(w); u8 rtid = v(f)->flags-1; if (xe==el_bit) { - if (rtid==n_add) { B r = m_f64(wi + bit_sum (bitarr_ptr(x), ia)); decG(x); return r; } - if (rtid==n_sub) { B r = m_f64((ia&1?-wi:wi) + bit_diff(bitarr_ptr(x), ia)); decG(x); return r; } + u64* xp = bitarr_ptr(x); + 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) { u64* xp = bitarr_ptr(x); 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 ) { u64* xp = bitarr_ptr(x); 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) { 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); } goto base; } if (rtid==n_add) { // + From 27943b85f4c6f8c4842e1b883d786d034ad35561 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 13 Aug 2022 14:39:53 -0400 Subject: [PATCH 5/7] =?UTF-8?q?Fast=20boolean=20=3D=C2=B4=20and=20?= =?UTF-8?q?=E2=89=A0=C2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index ebabdb95..6db40dfe 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -121,6 +121,12 @@ B scan_ne(u64 p, u64* xp, u64 ia) { return r; } +static bool fold_ne(u64* x, u64 am) { + u64 r = 0; + for (u64 i = 0; i < (am>>6); i++) r^= x[i]; + if (am&63) r^= x[am>>6]<<(64-am & 63); + return POPC(r) & 1; +} static i64 bit_diff(u64* x, u64 am) { i64 r = 0; u64 a = 0xAAAAAAAAAAAAAAAA; @@ -284,6 +290,8 @@ B fold_c1(Md1D* d, B x) { B f = d->f; 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_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; } if (rtid==n_add) { // + @@ -345,6 +353,8 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; 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_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; } if (rtid==n_add) { // + From 22925eee4b958b7bfce491ebcd55e218d8e71546 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 13 Aug 2022 15:03:18 -0400 Subject: [PATCH 6/7] =?UTF-8?q?Fast=20=E2=8C=8A`,=20matching=20=E2=8C=88`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 6db40dfe..8652f53b 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -175,6 +175,11 @@ B scan_c1(Md1D* d, B x) { B f = d->f; if (xe==el_i16) { i16* xp=i16any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } if (xe==el_i16) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=I16_MIN; for (usz i=0; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } @@ -231,6 +236,11 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f; if (xe==el_i16) { i16* xp=i16any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } if (xe==el_i16 && wv==(i16)wv) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=wv; for (usz i=0; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } From 195336b6df932058c2e1e41d3c80921adec06c46 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 13 Aug 2022 16:04:20 -0400 Subject: [PATCH 7/7] =?UTF-8?q?Implement=20F=CB=9Dx=20as=20f; if (isAtm(x) || rnk(x)==0) thrM("˝: 𝕩 must have rank at least 1"); usz xia = a(x)->ia; if (xia==0) return m1c1(rt_insert, f, x); + if (rnk(x)==1 && isFun(f) && isPervasiveDy(f)) { + return m_atomUnit(fold_c1(d, x)); + } S_SLICES(x) usz p = xia-x_csz;