From dad47cf391a29f92a9d7c52dfdb7bd332e1ee674 Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 1 Sep 2022 18:51:02 +0300 Subject: [PATCH] move arith_recd to a noinline function --- src/builtins/arithd.c | 4 ++-- src/utils/each.c | 22 ++++++++++++++++++---- src/utils/each.h | 16 ++-------------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index ad52611a..daa4a54c 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -178,8 +178,8 @@ static f64 pfmod(f64 a, f64 b) { } \ if ((we==el_i32|we==el_f64)&(xe==el_i32|xe==el_f64)) { \ bool wei = we==el_i32; bool xei = xe==el_i32; \ - if (wei&xei) { PI32(w)PI32(x)DOI32(EXPR,w,wp[i],xp[i],rcf64) } \ - if (!wei&!xei) {PF(w)PF(x) { } Rf64(x) DOF(EXPR,w,wp[i],xp[i]) decG(w);decG(x);return r; } \ + if (wei&xei) { PI32(w) PI32(x) DOI32(EXPR,w,wp[i],xp[i],rcf64) } \ + if (!wei&!xei) { PF(w) PF(x) Rf64(x) DOF(EXPR,w,wp[i],xp[i]) decG(w);decG(x);return r; } \ rcf64:; Rf64(x) \ if (wei) { PI32(w) \ if (xei) { PI32(x) DOF(EXPR,w,wp[i],xp[i]) } \ diff --git a/src/utils/each.c b/src/utils/each.c index 7e281642..a0b5a911 100644 --- a/src/utils/each.c +++ b/src/utils/each.c @@ -122,13 +122,27 @@ B eachm_fn(B fo, B x, BB2B f) { // TODO definitely rewrite this. Probably still for (usz i = 1; i < ia; i++) HARR_ADD(rHc, i, f(fo, inc(xp[i]))); return any_squeeze(HARR_FCD(rHc, x)); } - } else - rH = m_harr0c(x); - } else + } else goto m_fallback; + } else goto m_fallback; + m_fallback: rH = m_harr0c(x); fallback: rH.a[i++] = cr; for (; i < ia; i++) rH.a[i] = f(fo, Get(x,i)); decG(x); return any_squeeze(rH.b); -} \ No newline at end of file +} + +#if CATCH_ERRORS +B arith_recd(BBB2B f, B w, B x) { + B fx = getFillQ(x); + if (noFill(fx)) return eachd_fn(bi_N, w, x, f); + B fw = getFillQ(w); + B r = eachd_fn(bi_N, w, x, f); + if (noFill(fw)) { dec(fx); return r; } + if (CATCH) { freeThrown(); return r; } + B fr = f(bi_N, fw, fx); + popCatch(); + return withFill(r, asFill(fr)); +} +#endif \ No newline at end of file diff --git a/src/utils/each.h b/src/utils/each.h index a4910158..9f99f328 100644 --- a/src/utils/each.h +++ b/src/utils/each.h @@ -22,19 +22,7 @@ static B eachd(B f, B w, B x) { // complete w F¨ x without fills; consumes w,x #if CATCH_ERRORS -static inline B arith_recd(BBB2B f, B w, B x) { - B fx = getFillQ(x); - if (noFill(fx)) return eachd_fn(bi_N, w, x, f); - B fw = getFillQ(w); - B r = eachd_fn(bi_N, w, x, f); - if (noFill(fw)) { dec(fx); return r; } - if (CATCH) { freeThrown(); return r; } - B fr = f(bi_N, fw, fx); - popCatch(); - return withFill(r, asFill(fr)); -} +NOINLINE B arith_recd(BBB2B f, B w, B x); #else -static inline B arith_recd(BBB2B f, B w, B x) { - return eachd_fn(bi_N, w, x, f); -} +static inline B arith_recd(BBB2B f, B w, B x) { return eachd_fn(bi_N, w, x, f); } #endif