From ca264d13320268426ae07876246f5f47b01b90ac Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 19 Jul 2021 19:05:48 +0300 Subject: [PATCH] move init out of mut_to --- src/builtins/sfns.c | 30 +++++++++++++++--------------- src/utils/mut.c | 32 +++++++++++++++++++++++++++++++- src/utils/mut.h | 38 ++++++++------------------------------ 3 files changed, 54 insertions(+), 46 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 549b2709..2e1fe2df 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -163,7 +163,7 @@ B select_c2(B t, B w, B x) { if (rr>UR_MAX) thrF("āŠ: Result rank too large (%i≔=š•Ø, %i≔=š•©)", wr, xr); usz csz = arr_csz(x); usz cam = a(x)->sh[0]; - MAKE_MUT(r, wia*csz); mut_to(r, TI(x,elType)); + MAKE_MUT(r, wia*csz); mut_init(r, TI(x,elType)); for (usz i = 0; i < wia; i++) { B cw = wgetU(w, i); if (!isNum(cw)) { mut_pfree(r, i*csz); goto base; } @@ -349,7 +349,7 @@ B take_c2(B t, B w, B x) { u64 va = v<0? -v : v; if (va>ia) { B xf = getFillE(x); - MAKE_MUT(r, va); mut_to(r, TI(x,elType)); + MAKE_MUT(r, va); mut_init(r, TI(x,elType)); mut_copyG(r, v<0? va-ia : 0, x, 0, ia); mut_fill(r, v<0? 0 : ia, xf, va-ia); dec(x); dec(xf); @@ -464,7 +464,7 @@ B join_c2(B t, B w, B x) { if (rnk(r)==0) srnk(r,1); return qWithFill(r, f); } - MAKE_MUT(r, wia+xia); mut_to(r, el_or(TI(w,elType), TI(x,elType))); + MAKE_MUT(r, wia+xia); mut_init(r, el_or(TI(w,elType), TI(x,elType))); mut_copyG(r, 0, w, 0, wia); mut_copyG(r, wia, x, 0, xia); Arr* ra = mut_fp(r); @@ -510,7 +510,7 @@ B couple_c2(B t, B w, B x) { if (!eqShape(w, x)) thrF("ā‰: š•Ø and š•© must have equal shapes (%H ≔ ā‰¢š•Ø, %H ≔ ā‰¢š•©)", w, x); usz ia = a(w)->ia; ur wr = rnk(w); - MAKE_MUT(r, ia*2); mut_to(r, el_or(TI(w,elType), TI(x,elType))); + MAKE_MUT(r, ia*2); mut_init(r, el_or(TI(w,elType), TI(x,elType))); mut_copyG(r, 0, w, 0, ia); mut_copyG(r, ia, x, 0, ia); Arr* ra = mut_fp(r); @@ -537,7 +537,7 @@ B shiftb_c1(B t, B x) { B xf = getFillE(x); usz csz = arr_csz(x); - MAKE_MUT(r, ia); mut_to(r, TI(x,elType)); + MAKE_MUT(r, ia); mut_init(r, TI(x,elType)); mut_copyG(r, csz, x, 0, ia-csz); mut_fill(r, 0, xf, csz); return qWithFill(mut_fcd(r, x), xf); @@ -549,7 +549,7 @@ B shiftb_c2(B t, B w, B x) { B f = fill_both(w, x); usz wia = a(w)->ia; usz xia = a(x)->ia; - MAKE_MUT(r, xia); mut_to(r, el_or(TI(w,elType), TI(x,elType))); + MAKE_MUT(r, xia); mut_init(r, el_or(TI(w,elType), TI(x,elType))); int mid = wiaia; usz xia = a(x)->ia; - MAKE_MUT(r, xia); mut_to(r, el_or(TI(w,elType), TI(x,elType))); + MAKE_MUT(r, xia); mut_init(r, el_or(TI(w,elType), TI(x,elType))); if (wia < xia) { usz m = xia-wia; mut_copyG(r, 0, x, wia, m); @@ -722,7 +722,7 @@ B reverse_c1(B t, B x) { usz cam = a(x)->sh[0]; usz rp = 0; usz ip = xia; - MAKE_MUT(r, xia); mut_to(r, xe); + MAKE_MUT(r, xia); mut_init(r, xe); for (usz i = 0; i < cam; i++) { ip-= csz; mut_copyG(r, rp, x, ip, csz); @@ -741,7 +741,7 @@ B reverse_c2(B t, B w, B x) { i64 am = o2i64(w); if ((u64)am >= (u64)cam) { am%= (i64)cam; if(am<0) am+= cam; } am*= csz; - MAKE_MUT(r, xia); mut_to(r, TI(x,elType)); + MAKE_MUT(r, xia); mut_init(r, TI(x,elType)); mut_copyG(r, 0, x, am, xia-am); mut_copyG(r, xia-am, x, 0, am); return withFill(mut_fcd(r, x), xf); @@ -757,7 +757,7 @@ B pick_uc1(B t, B o, B x) { usz ia = a(x)->ia; B arg = TI(x,get)(x, 0); B rep = c1(o, arg); - MAKE_MUT(r, ia); mut_to(r, el_or(TI(x,elType), selfElType(rep))); + MAKE_MUT(r, ia); mut_init(r, el_or(TI(x,elType), selfElType(rep))); mut_setG(r, 0, rep); mut_copyG(r, 1, x, 1, ia-1); return qWithFill(mut_fcd(r, x), xf); @@ -791,7 +791,7 @@ B pick_ucw(B t, B o, B w, B x) { return x; } } - MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), selfElType(rep))); + MAKE_MUT(r, xia); mut_init(r, el_or(TI(x,elType), selfElType(rep))); mut_setG(r, wi, rep); mut_copyG(r, 0, x, 0, wi); mut_copyG(r, wi+1, x, wi+1, xia-wi-1); @@ -807,7 +807,7 @@ B slash_ucw(B t, B o, B w, B x) { usz argIA = a(arg)->ia; B rep = c1(o, arg); if (isAtm(rep) || rnk(rep)!=1 || a(rep)->ia != argIA) thrF("š”½āŒ¾(a⊸/)š•©: Result of š”½ must have the same shape as a/š•© (expected ⟨%s⟩, got %H)", argIA, rep); - MAKE_MUT(r, ia); mut_to(r, el_or(TI(x,elType), TI(rep,elType))); + MAKE_MUT(r, ia); mut_init(r, el_or(TI(x,elType), TI(rep,elType))); BS2B xget = TI(x,get); BS2B rgetU = TI(rep,getU); BS2B rget = TI(rep,get); @@ -871,7 +871,7 @@ B select_ucw(B t, B o, B w, B x) { return x; } } - MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), TI(rep,elType))); + MAKE_MUT(r, xia); mut_init(r, el_or(TI(x,elType), TI(rep,elType))); mut_copyG(r, 0, x, 0, xia); BS2B rget = TI(rep,get); for (usz i = 0; i < wia; i++) { @@ -884,7 +884,7 @@ B select_ucw(B t, B o, B w, B x) { dec(w); dec(rep); FREE_CHECK; return mut_fcd(r, x); } - MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), TI(rep,elType))); + MAKE_MUT(r, xia); mut_init(r, el_or(TI(x,elType), TI(rep,elType))); mut_copyG(r, 0, x, 0, xia); BS2B rget = TI(rep,get); for (usz i = 0; i < wia; i++) { diff --git a/src/utils/mut.c b/src/utils/mut.c index 0629c9dc..50bd0c24 100644 --- a/src/utils/mut.c +++ b/src/utils/mut.c @@ -1,13 +1,43 @@ #include "../core.h" #include "mut.h" + +NOINLINE void mut_to(Mut* m, u8 n) { + u8 o = m->type; + assert(o!=el_B); + if (o==el_MAX) { + mut_init(m, n); + } else { + m->type = n; + sprnk(m->val, 1); + m->val->sh = &m->val->ia; + #ifdef USE_VALGRIND + VALGRIND_MAKE_MEM_DEFINED(m->val, mm_size((Value*)m->val)); // it's incomplete, but it's a typed array so garbage is acceptable + #endif + #ifdef DEBUG + if (n==el_B && o==el_f64) { // hack to make toHArr calling f64arr_get not cry about possible sNaN floats + usz ia = m->val->ia; + f64* p = f64arr_ptr(taga(m->val)); + for (usz i = 0; i < ia; i++) if (!isF64(b(p[i]))) p[i] = 1.2217638442043777e161; // 0x6161616161616161 + } + #endif + switch(n) { default: UD; + case el_i32: { I32Arr* t=toI32Arr(taga(m->val)); m->val=(Arr*)t; m->ai32=t->a; return; } + case el_f64: { F64Arr* t=toF64Arr(taga(m->val)); m->val=(Arr*)t; m->af64=t->a; return; } + case el_c32: { C32Arr* t=toC32Arr(taga(m->val)); m->val=(Arr*)t; m->ac32=t->a; return; } + case el_B : { HArr* t=toHArr (taga(m->val)); m->val=(Arr*)t; m->aB =t->a; return; } + } + } +} + NOINLINE B vec_addR(B w, B x) { usz wia = a(w)->ia; - MAKE_MUT(r, wia+1); mut_to(r, el_or(TI(w,elType), selfElType(x))); + MAKE_MUT(r, wia+1); mut_init(r, el_or(TI(w,elType), selfElType(x))); mut_copyG(r, 0, w, 0, wia); mut_setG(r, wia, x); dec(w); return mut_fv(r); } + NOINLINE void mut_pfree(Mut* m, usz n) { // free the first n elements if (m->type==el_B) harr_pfree(taga(m->val), n); else mm_free((Value*) m->val); diff --git a/src/utils/mut.h b/src/utils/mut.h index 8377859b..470cc97e 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -13,38 +13,16 @@ typedef struct Mut { } Mut; #define MAKE_MUT(N, IA) Mut N##_val; N##_val.type = el_MAX; N##_val.ia = (IA); Mut* N = &N##_val; -static void mut_to(Mut* m, u8 n) { - u8 o = m->type; - assert(o!=el_B); +static void mut_init(Mut* m, u8 n) { m->type = n; - if (o==el_MAX) { - switch(n) { default: UD; - case el_i32: m->val = m_i32arrp(&m->ai32, m->ia); return; - case el_f64: m->val = m_f64arrp(&m->af64, m->ia); return; - case el_c32: m->val = m_c32arrp(&m->ac32, m->ia); return; - case el_B :; HArr_p t = m_harrUp( m->ia); m->val = (Arr*)t.c; m->aB = t.c->a; return; - } - } else { - sprnk(m->val, 1); - m->val->sh = &m->val->ia; - #ifdef USE_VALGRIND - VALGRIND_MAKE_MEM_DEFINED(m->val, mm_size((Value*)m->val)); // it's incomplete, but it's a typed array so garbage is acceptable - #endif - #ifdef DEBUG - if (n==el_B && o==el_f64) { // hack to make toHArr calling f64arr_get not cry about possible sNaN floats - usz ia = m->val->ia; - f64* p = f64arr_ptr(taga(m->val)); - for (usz i = 0; i < ia; i++) if (!isF64(b(p[i]))) p[i] = 1.2217638442043777e161; // 0x6161616161616161 - } - #endif - switch(n) { default: UD; - case el_i32: { I32Arr* t=toI32Arr(taga(m->val)); m->val=(Arr*)t; m->ai32=t->a; return; } - case el_f64: { F64Arr* t=toF64Arr(taga(m->val)); m->val=(Arr*)t; m->af64=t->a; return; } - case el_c32: { C32Arr* t=toC32Arr(taga(m->val)); m->val=(Arr*)t; m->ac32=t->a; return; } - case el_B : { HArr* t=toHArr (taga(m->val)); m->val=(Arr*)t; m->aB =t->a; return; } - } + switch(n) { default: UD; + case el_i32: m->val = m_i32arrp(&m->ai32, m->ia); return; + case el_f64: m->val = m_f64arrp(&m->af64, m->ia); return; + case el_c32: m->val = m_c32arrp(&m->ac32, m->ia); return; + case el_B :; HArr_p t = m_harrUp( m->ia); m->val = (Arr*)t.c; m->aB = t.c->a; return; } } +void mut_to(Mut* m, u8 n); static B mut_fv(Mut* m) { assert(m->type!=el_MAX); m->val->sh = &m->val->ia; @@ -373,7 +351,7 @@ static B vec_join(B w, B x) { // consumes both return w; } } - MAKE_MUT(r, ria); mut_to(r, el_or(TI(w,elType), TI(x,elType))); + MAKE_MUT(r, ria); mut_init(r, el_or(TI(w,elType), TI(x,elType))); mut_copy(r, 0, w, 0, wia); mut_copy(r, wia, x, 0, xia); dec(w); dec(x);