From e0b41180cf07d211b4d5792531cfd1e7d93e3d85 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 14 May 2021 20:44:19 +0300 Subject: [PATCH] =?UTF-8?q?F=C2=B4i32vec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/arith.c | 14 ++++---------- src/md1.c | 11 +++++++++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/arith.c b/src/arith.c index 41274abb..6b23d0c1 100644 --- a/src/arith.c +++ b/src/arith.c @@ -115,18 +115,12 @@ B gt_c1(B t, B x) { return c1(rt_merge, x); } #undef P1 #undef P2 -#define ba(N) bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); c(Fun,bi_##N)->c2 = N##_c2 ;c(Fun,bi_##N)->c1 = N##_c1 ; c(Fun,bi_##N)->extra=pf_##N; c(BFn,bi_##N)->ident=bi_N; gc_add(bi_##N); -#define bd(N) bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); c(Fun,bi_##N)->c2 = N##_c2 ;c(Fun,bi_##N)->c1 = c1_invalid; c(Fun,bi_##N)->extra=pf_##N; c(BFn,bi_##N)->ident=bi_N; gc_add(bi_##N); -#define bm(N) bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); c(Fun,bi_##N)->c2 = c2_invalid;c(Fun,bi_##N)->c1 = N##_c1 ; c(Fun,bi_##N)->extra=pf_##N; c(BFn,bi_##N)->ident=bi_N; gc_add(bi_##N); - -B bi_add, bi_sub, bi_mul, bi_div, bi_pow, bi_floor, bi_ceil, bi_stile, bi_eq, bi_ne, bi_le, bi_ge, bi_lt, bi_gt, bi_and, bi_or, bi_not, bi_log; -static inline void arith_init() { ba(add) ba(sub) ba(mul) ba(div) ba(pow) ba(floor) ba(ceil) ba(stile) ba(eq) ba(ne) bd(le) bd(ge) ba(lt) ba(gt) ba(and) ba(or) ba(not) ba(log) +#define F(A,M,D) A(add) A(sub) A(mul) A(div) A(pow) A(floor) A(ceil) A(stile) A(eq) A(ne) D(le) D(ge) A(lt) A(gt) A(and) A(or) A(not) A(log) +BI_FNS0(F); +static inline void arith_init() { BI_FNS1(F) c(BFn,bi_add)->ident = c(BFn,bi_sub)->ident = c(BFn,bi_or )->ident = c(BFn,bi_ne)->ident = c(BFn,bi_gt)->ident = m_i32(0); c(BFn,bi_mul)->ident = c(BFn,bi_div)->ident = c(BFn,bi_and)->ident = c(BFn,bi_eq)->ident = c(BFn,bi_ge)->ident = c(BFn,bi_pow)->ident = c(BFn,bi_not)->ident = m_i32(1); c(BFn,bi_floor)->ident = m_f64(1.0/0.0); c(BFn,bi_ceil )->ident = m_f64(-1.0/0.0); } - -#undef ba -#undef bd -#undef bm +#undef F \ No newline at end of file diff --git a/src/md1.c b/src/md1.c index e91e61d1..6ca1532d 100644 --- a/src/md1.c +++ b/src/md1.c @@ -164,9 +164,16 @@ B fold_c1(B d, B x) { B f = c(Md1D,d)->f; thrM("ยด: No identity found"); } BS2B xget = TI(x).get; - B c = xget(x, ia-1); BBB2B fc2 = c2fn(f); - for (usz i = ia-1; i>0; i--) c = fc2(f, xget(x, i-1), c); + B c; + if (TI(x).elType==el_i32) { + i32* xp = i32any_ptr(x); + c = m_i32(xp[ia-1]); + for (usz i = ia-1; i>0; i--) c = fc2(f, m_i32(xp[i-1]), c); + } else { + c = xget(x, ia-1); + for (usz i = ia-1; i>0; i--) c = fc2(f, xget(x, i-1), c); + } dec(x); return c; }