⌜ impls
This commit is contained in:
parent
d2682c595b
commit
2e2dcb3134
@ -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)
|
||||
|
||||
@ -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 (rr<xr) thrF("⌜: Result rank too large (%i≡=𝕨, %i≡=𝕩)", wr, xr);
|
||||
|
||||
SGetU(w)
|
||||
SGet(x)
|
||||
BBB2B fc2 = c2fn(f);
|
||||
B r;
|
||||
usz* rsh;
|
||||
|
||||
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)));
|
||||
if (!EACH_FILLS && isFun(f) && isPervasiveDy(f) && TI(w,arrD1)) {
|
||||
BBB2B fc2 = c(Fun,f)->c2;
|
||||
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));
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user