From f76836aedd4276cc5e6309d8fbd43ba0fed9572c Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 17 Feb 2023 16:21:31 +0200 Subject: [PATCH] clean up arithd.c & slightly improve non-Singeli impls --- src/builtins/arithd.c | 93 ++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 50 deletions(-) diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index ccae09fd..4e3f436d 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -37,9 +37,8 @@ typedef void (*AndBytesFn)(u8*, u8*, u64, u64); #endif #define ARITH_SLOW(N) SLOWIF((!isArr(w) || TI(w,elType)!=el_B) && (!isArr(x) || TI(x,elType)!=el_B)) SLOW2("arithd " #N, w, x) -#define P2(N) { if(isArr(w)|isArr(x)) { ARITH_SLOW(N); \ - return arith_recd(N##_c2, w, x); \ -}} +#define P2(N) { if(isArr(w)|isArr(x)) { ARITH_SLOW(N); return arith_recd(N##_c2, w, x); }} + #if !TYPED_ARITH #define AR_I_TO_ARR(NAME) P2(NAME) #define AR_F_TO_ARR AR_I_TO_ARR @@ -84,11 +83,11 @@ typedef void (*AndBytesFn)(u8*, u8*, u64, u64); if (xexv?xv:wv, REG_SA, {}) AR_I_SA("⌈", ceil , wv>xv?wv:xv, REG_SA, {}) - AR_I_SA("+", add, wv+xv, SI_SA, { - if (isC32(w) && xe==el_i32) { + AR_I_SA("+", add, wv+xv, REG_SA, { + if (isC32(w) && elInt(xe)) { u32 wv = o2cG(w); + if (xe!=el_i32) x = taga(cpyI32Arr(x)); i32* xp = i32any_ptr(x); usz xia = IA(x); u32* rp; r = m_c32arrc(&rp, x); for (usz i = 0; i < xia; i++) { @@ -293,9 +289,10 @@ typedef void (*AndBytesFn)(u8*, u8*, u64, u64); #undef AR_I_SA - AR_I_AS("-", sub, wv-xv, SI_AS, { - if (we==el_c32 && isC32(x)) { + AR_I_AS("-", sub, wv-xv, REG_AS, { + if (elChr(we) && isC32(x)) { i32 xv = (i32)o2cG(x); + if (we!=el_c32) w = taga(cpyC32Arr(w)); u32* wp = c32any_ptr(w); usz wia = IA(w); i32* rp; r = m_i32arrc(&rp, w); for (usz i = 0; i < wia; i++) rp[i] = (i32)wp[i] - xv; @@ -314,18 +311,15 @@ typedef void (*AndBytesFn)(u8*, u8*, u64, u64); #define AR_F_TO_ARR(NAME) return NAME##_c2_arr(t, w, x); #define AR_I_TO_ARR(NAME) \ - if (isArr(x)) { \ - if (isArr(w)) return NAME##_AA(t, w, x); \ - else return NAME##_SA(t, w, x); \ - } else if (isArr(w)) return NAME##_AS(t, w, x); + if (isArr(x)) return isArr(w)? NAME##_AA(t, w, x) : NAME##_SA(t, w, x); \ + else if (isArr(w)) return NAME##_AS(t, w, x); #endif // TYPED_ARITH #define AR_I_SCALAR(CHR, NAME, EXPR, MORE) B NAME##_c2(B t, B w, B x) { \ if (isF64(w) & isF64(x)) return m_f64(EXPR); \ - MORE \ - AR_I_TO_ARR(NAME) \ - thrM(CHR ": Unexpected argument types"); \ + MORE; AR_I_TO_ARR(NAME) \ + thrM(CHR ": Unexpected argument types"); \ } AR_I_SCALAR("+", add, w.f+x.f, { @@ -348,8 +342,8 @@ B not_c2(B t, B w, B x) { #define AR_F_SCALAR(CHR, NAME, EXPR) B NAME##_c2(B t, B w, B x) { \ if (isF64(w) & isF64(x)) return m_f64(EXPR); \ - AR_F_TO_ARR(NAME) \ - thrM(CHR ": Unexpected argument types"); \ + AR_F_TO_ARR(NAME) \ + thrM(CHR ": Unexpected argument types"); \ } AR_F_SCALAR("÷", div , w.f/x.f) AR_F_SCALAR("⋆", pow , pow(w.f, x.f)) @@ -390,12 +384,11 @@ static f64 comb(f64 k, f64 n) { // n choose k return exp(lgamma(n+1) - lgamma(k+1) - lgamma(j+1)); } -#define MATH(n,N) \ - B n##_c2(B t, B w, B x) { \ - if (isNum(w) && isNum(x)) return m_f64(n(x.f, w.f)); \ - P2(n) \ - thrM("•math." #N ": Unexpected argument types"); \ - } +#define MATH(n,N) B n##_c2(B t, B w, B x) { \ + if (isNum(w) && isNum(x)) return m_f64(n(x.f, w.f)); \ + P2(n) \ + thrM("•math." #N ": Unexpected argument types"); \ +} MATH(atan2,Atan2) MATH(hypot,Hypot) MATH(comb,Comb) #undef MATH