diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index 809415db..3b010222 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -46,24 +46,37 @@ B floor_c2(B, B, B); *p = s; return we|xe; } + + #define PF(N) f64* N##p = f64any_ptr(N); + #define PI8(N) i8* N##p = i8any_ptr (N); + #define PI16(N) i16* N##p = i16any_ptr(N); + #define PI32(N) i32* N##p = i32any_ptr(N); + #define Ri8(A) i8* rp; r=m_i8arrc (&rp, A); + #define Ri16(A) i16* rp; r=m_i16arrc(&rp, A); + #define Ri32(A) i32* rp; r=m_i32arrc(&rp, A); + #define Rf64(A) f64* rp; r=m_f64arrc(&rp, A); + #define DOF(EXPR,A,W,X) { for (usz i = 0; i < ia; i++) { f64 wv=W; f64 xv=X; rp[i]=EXPR; } } + #define DOI8(EXPR,A,W,X,BASE) { Ri8(A) for (usz i=0; iCHR_MAX) thrM("-: Invalid character"); // safe - see add } - decG(w); decG(x); - return r; + goto dec_ret; }) }) #undef AR_I_AA @@ -225,15 +226,17 @@ B floor_c2(B, B, B); #define AR_I_AS(CHR, NAME, EXPR, DO_AS, EXTRA) NOINLINE B NAME##_AS(B t, B w, B x) { \ - u8 we=TI(w,elType); EXTRA \ + B r; u8 we=TI(w,elType); EXTRA \ if (isF64(x)) { usz ia=IA(w); DO_AS(NAME,EXPR) } \ ARITH_SLOW; return arith_recd(NAME##_c2, w, x); \ + dec_ret: decG(w); return r; \ } #define AR_I_SA(CHR, NAME, EXPR, DO_SA, EXTRA) NOINLINE B NAME##_SA(B t, B w, B x) { \ - u8 xe=TI(x,elType); EXTRA \ + B r; u8 xe=TI(x,elType); EXTRA \ if (isF64(w)) { usz ia=IA(x); DO_SA(NAME,EXPR) } \ ARITH_SLOW; return arith_recd(NAME##_c2, w, x); \ + dec_ret: decG(x); return r; \ } static NOINLINE B bit_sel1Fn(BBB2B f, B w, B x, bool bitX) { // consumes both @@ -264,13 +267,12 @@ B floor_c2(B, B, B); if (isC32(w) && xe==el_i32) { u32 wv = o2cu(w); i32* xp = i32any_ptr(x); usz xia = IA(x); - u32* rp; B r = m_c32arrc(&rp, x); + u32* rp; r = m_c32arrc(&rp, x); for (usz i = 0; i < xia; i++) { rp[i] = (u32)(xp[i]+(i32)wv); if (rp[i]>CHR_MAX) thrM("+: Invalid character"); // safe to only check this as wv already must be below CHR_MAX, which is less than U32_MAX/2 } - decG(x); - return r; + goto dec_ret; } }) #undef AR_I_SA @@ -280,10 +282,9 @@ B floor_c2(B, B, B); if (we==el_c32 && isC32(x)) { i32 xv = (i32)o2cu(x); u32* wp = c32any_ptr(w); usz wia = IA(w); - i32* rp; B r = m_i32arrc(&rp, w); + i32* rp; r = m_i32arrc(&rp, w); for (usz i = 0; i < wia; i++) rp[i] = (i32)wp[i] - xv; - decG(w); - return r; + goto dec_ret; } }) #define add_AS(T, W, X) add_SA(T, X, W)