From 2e2dcb3134797fed6028680d4a6e31d17d574b31 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 23 Jan 2022 17:38:55 +0200 Subject: [PATCH] =?UTF-8?q?=E2=8C=9C=20impls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins.h | 4 ++++ src/builtins/md1.c | 44 ++++++++++++++++++++++++++++++++------------ src/jit/nvm_x86_64.c | 24 ++++-------------------- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/builtins.h b/src/builtins.h index 04c4b35a..d063e031 100644 --- a/src/builtins.h +++ b/src/builtins.h @@ -74,6 +74,10 @@ static inline bool isImpureBuiltin(B x) { return false; } +// these assume x is a function +static inline bool isPervasiveDy (B x) { return (u8)(v(x)->flags-1) <= n_ge; } +static inline bool isPervasiveMon(B x) { return (u8)(v(x)->flags-1) <= n_stile; } + extern B #define F(N,X) bi_##N, FOR_PFN(F,F,F) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index fdd64c4c..1d43dc73 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -42,6 +42,9 @@ B tbl_c1(Md1D* d, B x) { B f = d->f; B xf = getFillQ(x); return homFil1(f, eachm(f, x), xf); } + +B slash_c2(B f, B w, B x); +B shape_c2(B f, B w, B x); B tbl_c2(Md1D* d, B w, B x) { B f = d->f; B wf, xf; if (EACH_FILLS) wf = getFillQ(w); @@ -53,25 +56,42 @@ B tbl_c2(Md1D* d, B w, B x) { B f = d->f; ur rr = wr+xr; usz ria = uszMul(wia, xia); if (rrc2; + if (TI(x,arrD1) && xia<80 && wia>130) { + Arr* wd = TI(w,slice)(inc(w), 0, wia); + arr_shVec(wd); + r = fc2(f, slash_c2(f, m_i32(xia), taga(wd)), shape_c2(f, m_f64(ria), inc(x))); + } else { + SGet(w) + M_HARR(r, wia) + for (usz wi = 0; wi < wia; wi++) HARR_ADD(r, wi, fc2(f, Get(w,wi), inc(x))); + r = bqn_merge(HARR_FV(r)); } + if (rnk(r)>1) ptr_dec(shObj(r)); + rsh = arr_shAlloc(a(r), rr); + } else { + BBB2B fc2 = c2fn(f); + SGetU(w) SGet(x) + + M_HARR(r, ria) + for (usz wi = 0; wi < wia; wi++) { + B cw = GetU(w,wi); + for (usz xi = 0; xi < xia; xi++) HARR_ADDA(r, fc2(f, inc(cw), Get(x,xi))); + } + rsh = HARR_FA(r, rr); + r = HARR_O(r).b; } - usz* rsh = HARR_FA(r, rr); if (rsh) { memcpy(rsh , a(w)->sh, wr*sizeof(usz)); memcpy(rsh+wr, a(x)->sh, xr*sizeof(usz)); } dec(w); dec(x); - if (EACH_FILLS) return homFil2(f, HARR_O(r).b, wf, xf); - return HARR_O(r).b; + if (EACH_FILLS) return homFil2(f, r, wf, xf); + return r; } B each_c1(Md1D* d, B x) { B f = d->f; @@ -326,7 +346,7 @@ B swap_c2(Md1D* d, B w, B x) { return c2(d->f, x , w); } B timed_c2(Md1D* d, B w, B x) { B f = d->f; i64 am = o2i64(w); - for (i64 i = 0; i < am; i++) inc(x); + incBy(x, am); dec(x); u64 sns = nsTime(); for (i64 i = 0; i < am; i++) dec(c1(f, x)); diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index 45f84ca0..f3756ad1 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -633,26 +633,10 @@ Nvm_res m_nvm(Body* body) { } break; case EXTO: TOPs; { u64 d=*bc++; IMM(R_A0,*bc++); LSC(R_A1,d); IMM(R_A2,off); INV(3,1,i_EXTO); } break; // (u32 p, Scope* sc, u32* bc, S) case EXTU: TOPs; { u64 d=*bc++; IMM(R_A0,*bc++); LSC(R_A1,d); CCALL(i_EXTU); } break; // (u32 p, Scope* sc) - case SETH1:TOPp; { u64 v1=L64; // (B s, B x, Scope** pscs, u32* bc, Body* v) - GET(R_A1,1,1); LEAi(R_A2,R_SP,VAR(pscs,0)); IMM(R_A3,off); IMM(R_A4,v1); CCALL(i_SETH1); - IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); - break; - } - case SETH2:TOPp; { u64 v1=L64; u64 v2=L64; // (B s, B x, Scope** pscs, u32* bc, Body* v1, Body* v2) - GET(R_A1,1,1); LEAi(R_A2,R_SP,VAR(pscs,0)); IMM(R_A3,off); IMM(R_A4,v1); IMM(R_A5,v2); CCALL(i_SETH2); - IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); - break; - } - case PRED1:TOPp; { u64 v1=L64; // (B x, Scope** pscs, u32* bc, Body* v) - GET(R_A1,0,2); MOV(R_A1,r_SC); IMM(R_A2,off); IMM(R_A3,v1); CCALL(i_PRED1); - IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); NORES(1); - break; - } - case PRED2:TOPp; { u64 v1=L64; u64 v2=L64; // (B x, Scope** pscs, u32* bc, Body* v1, Body* v2) - GET(R_A1,0,2); MOV(R_A1,r_SC); IMM(R_A2,off); IMM(R_A3,v1); IMM(R_A4,v2); CCALL(i_PRED2); - IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); NORES(1); - break; - } + case SETH1:TOPp; { u64 v1=L64; GET(R_A1,1,1); LEAi(R_A2,R_SP,VAR(pscs,0)); IMM(R_A3,off); IMM(R_A4,v1); CCALL(i_SETH1); IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); break; } // (B s, B x, Scope** pscs, u32* bc, Body* v) + case SETH2:TOPp; { u64 v1=L64; u64 v2=L64; GET(R_A1,1,1); LEAi(R_A2,R_SP,VAR(pscs,0)); IMM(R_A3,off); IMM(R_A4,v1); IMM(R_A5,v2); CCALL(i_SETH2); IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); break; } // (B s, B x, Scope** pscs, u32* bc, Body* v1, Body* v2) + case PRED1:TOPp; { u64 v1=L64; GET(R_A1,0,2); MOV(R_A1,r_SC); IMM(R_A2,off); IMM(R_A3,v1); CCALL(i_PRED1); IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); NORES(1); break; } // (B x, Scope** pscs, u32* bc, Body* v) + case PRED2:TOPp; { u64 v1=L64; u64 v2=L64; GET(R_A1,0,2); MOV(R_A1,r_SC); IMM(R_A2,off); IMM(R_A3,v1); IMM(R_A4,v2); CCALL(i_PRED2); IMM(R_A0, bi_okHdr.u); CMP(R_A0,R_RES); J4(cNE,l); TSADD(retLbls, l); NORES(1); break; } // (B x, Scope** pscs, u32* bc, Body* v1, Body* v2) case SETN: TOPp; GET(R_A1,1,1); LEAi(R_A2,R_SP,VAR(pscs,0)); IMM(R_A3,off); CCALL(i_SETN); break; // (B s, B x, Scope** pscs, u32* bc) case SETU: TOPp; GET(R_A1,1,1); LEAi(R_A2,R_SP,VAR(pscs,0)); IMM(R_A3,off); CCALL(i_SETU); break; // (B s, B x, Scope** pscs, u32* bc) case SETM: TOPp; GET(R_A1,1,1); GET(R_A2,2,1); LEAi(R_A3,R_SP,VAR(pscs,0)); IMM(R_A4,off); CCALL(i_SETM); break; // (B s, B f, B x, Scope** pscs, u32* bc)