From e7662b0f6a44add0749fba2a6d7309a5c1eb2601 Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 13 Dec 2021 00:16:15 +0200 Subject: [PATCH] separate array & scalar cases in arith builtins --- src/builtins/arithd.c | 24 ++++++++++++++++-------- src/core/stuff.c | 1 + src/singeli/c/cmp.c | 4 ++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index 9dc6b7f1..6f297bc8 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -151,9 +151,14 @@ dec(a); return r; } - #define GC2i(SYMB, NAME, EXPR, EXTRA, BIT) B NAME##_c2(B t, B w, B x) { \ + #define GC2i(SYMB, NAME, EXPR, EXTRA1, EXTRA2, BIT) \ + static NOINLINE B NAME##_c2_arr(B t, B w, B x); \ + B NAME##_c2(B t, B w, B x) { \ if (isF64(w) & isF64(x)) {f64 wv=w.f,xv=x.f;return m_f64(EXPR);} \ - EXTRA \ + EXTRA1 return NAME##_c2_arr(t,w,x); \ + } \ + static B NAME##_c2_arr(B t, B w, B x) { \ + EXTRA2 \ if (isArr(w)|isArr(x)) { \ if (isArr(w)&isArr(x) && rnk(w)==rnk(x)) { \ if (memcmp(a(w)->sh, a(x)->sh, rnk(w)*sizeof(usz))) thrF(SYMB ": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \ @@ -233,9 +238,11 @@ static f64 pfmod(f64 a, f64 b) { return r; } + GC2i("+", add, wv+xv, { if (isC32(w) & isF64(x)) { u64 r = (u64)(o2cu(w)+o2i64(x)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); } if (isF64(w) & isC32(x)) { u64 r = (u64)(o2cu(x)+o2i64(w)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); } +},{ if (isArr(w)&isC32(x) || isC32(w)&isArr(x)) { if (isArr(w)) { B t=w;w=x;x=t; } if (TI(x,elType) == el_i32) { u32 wv = o2cu(w); @@ -253,6 +260,7 @@ GC2i("+", add, wv+xv, { GC2i("-", sub, wv-xv, { if (isC32(w) & isF64(x)) { u64 r = (u64)((i32)o2cu(w)-o2i64(x)); if(r>CHR_MAX)thrM("-: Invalid character"); return m_c32((u32)r); } if (isC32(w) & isC32(x)) return m_f64((i32)(u32)w.u - (i32)(u32)x.u); +},{ if (isArr(w) && TI(w,elType)==el_c32) { if (isC32(x)) { i32 xv = (i32)o2cu(x); @@ -280,12 +288,12 @@ GC2i("-", sub, wv-xv, { GC2i("¬", not, 1+wv-xv, { if (isC32(w) & isF64(x)) { u64 r = (u64)(1+(i32)o2cu(w)-o2i64(x)); if(r>CHR_MAX)thrM("¬: Invalid character"); return m_c32((u32)r); } if (isC32(w) & isC32(x)) return m_f64(1 + (i32)(u32)w.u - (i32)(u32)x.u); -}, 0) -GC2i("×", mul, wv*xv, {}, 2) -GC2i("∧", and, wv*xv, {}, 2) -GC2i("∨", or , (wv+xv)-(wv*xv), {}, 1) -GC2i("⌊", floor, wv>xv?xv:wv, {}, 2) // optimizer optimizes out the fallback mess -GC2i("⌈", ceil , wv>xv?wv:xv, {}, 1) +}, {}, 0) +GC2i("×", mul, wv*xv, {}, {}, 2) +GC2i("∧", and, wv*xv, {}, {}, 2) +GC2i("∨", or , (wv+xv)-(wv*xv), {}, {}, 1) +GC2i("⌊", floor, wv>xv?xv:wv, {}, {}, 2) // optimizer optimizes out the fallback mess +GC2i("⌈", ceil , wv>xv?wv:xv, {}, {}, 1) GC2f("÷", div , w.f/x.f, {}) GC2f("⋆", pow , pow(w.f, x.f), {}) diff --git a/src/core/stuff.c b/src/core/stuff.c index 66d5f725..c3767590 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -4,6 +4,7 @@ #include "../utils/talloc.h" #include "../builtins.h" +bool please_tail_call_err = true; bool inErr; NORETURN NOINLINE void err(char* s) { diff --git a/src/singeli/c/cmp.c b/src/singeli/c/cmp.c index c8047c29..b6de82ae 100644 --- a/src/singeli/c/cmp.c +++ b/src/singeli/c/cmp.c @@ -12,8 +12,8 @@ static NOINLINE void fillBitsDec(u64* dst, u64 sz, bool v, u64 x) { fillBits(dst, sz, v); } -bool please_tail_call_cmp_err = 1; -static NOINLINE void cmp_err() { if (please_tail_call_cmp_err) thrM("Invalid comparison"); } +extern bool please_tail_call_err; +static NOINLINE void cmp_err() { if (please_tail_call_err) thrM("Invalid comparison"); } #define BCALL(N, X) N(b(X))