From 38683119c07b9ed2ddb8b33f04945cd0493b4843 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 20 Nov 2022 22:00:40 -0500 Subject: [PATCH] Handle some f64 cases in dyadic fold --- src/builtins/fold.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/builtins/fold.c b/src/builtins/fold.c index 1adb97f4..d3e23275 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -96,14 +96,14 @@ B fold_c1(Md1D* d, B x) { B f = d->f; : sum_fns[sel](xv, ia, 0); decG(x); return m_f64(r); } + if (rtid==n_floor) { f64 r=min_fns[xe-el_i8](tyany_ptr(x), ia); decG(x); return m_f64(r); } // ⌊ + if (rtid==n_ceil ) { f64 r=max_fns[xe-el_i8](tyany_ptr(x), ia); decG(x); return m_f64(r); } // ⌈ if (rtid==n_mul | rtid==n_and) { // ×/∧ if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=1; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_f64(c); } if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=1; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=1; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } if (xe==el_f64) { f64* xp = f64any_ptr(x); f64 c=1; for (usz i=ia; i--; ) c*= xp[i]; decG(x); return m_f64(c); } } - if (rtid==n_floor) { f64 r=min_fns[xe-el_i8](tyany_ptr(x), ia); decG(x); return m_f64(r); } // ⌊ - if (rtid==n_ceil ) { f64 r=max_fns[xe-el_i8](tyany_ptr(x), ia); decG(x); return m_f64(r); } // ⌈ if (rtid==n_or) { // ∨ if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool r=0; for (usz i=0; if; if (isAtm(x) || RNK(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x); usz ia = IA(x); u8 xe = TI(x,elType); - if (q_i32(w) && isFun(f) && v(f)->flags && elInt(xe)) { - i32 wi = o2iG(w); + if (isF64(w) && isFun(f) && v(f)->flags && xe<=el_f64) { + f64 wf = w.f; u8 rtid = v(f)->flags-1; if (xe==el_bit) { + i32 wi = wf; if (wi!=wf) goto base; 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; } @@ -148,17 +149,19 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; } if (rtid==n_add) { // + u8 sel = xe - el_i8; - f64 r = sum_fns[sel](tyany_ptr(x), ia, wi); + f64 r = sum_fns[sel](tyany_ptr(x), ia, wf); decG(x); return m_f64(r); } + if (rtid==n_floor) { f64 r=wf; if (ia>0) { f64 m=min_fns[xe-el_i8](tyany_ptr(x), ia); if (m0) { f64 m=max_fns[xe-el_i8](tyany_ptr(x), ia); if (m>r) r=m; } decG(x); return m_f64(r); } // ⌈ + i32 wi = wf; if (rtid==n_mul | rtid==n_and) { // ×/∧ - if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } - if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } - if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } + if (xe==el_i8 && wi==wf) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } + if (xe==el_i16 && wi==wf) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } + if (xe==el_i32 && wi==wf) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=ia; i--; ) if (mulOn(c,xp[i]))goto base; decG(x); return m_i32(c); } + if (xe==el_f64 ) { f64* xp = f64any_ptr(x); f64 c=wf; for (usz i=ia; i--; ) c*= xp[i]; decG(x); return m_f64(c); } } - if (rtid==n_floor) { f64 r=wi; if (ia>0) { f64 m=min_fns[xe-el_i8](tyany_ptr(x), ia); if (m0) { f64 m=max_fns[xe-el_i8](tyany_ptr(x), ia); if (m>r) r=m; } decG(x); return m_f64(r); } // ⌈ - if (rtid==n_or && (wi&1)==wi) { // ∨ + if (rtid==n_or && (wi&1)==wf) { // ∨ if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool q=wi; for (usz i=0; i