enum of primitive numbering
This commit is contained in:
parent
dd3965cb3c
commit
8cfbaf8b30
@ -25,6 +25,16 @@
|
|||||||
/* everything before the definition of •_while_ is defined to be pure, and everything after is not */ \
|
/* everything before the definition of •_while_ is defined to be pure, and everything after is not */ \
|
||||||
/*md2.c*/ A(while,"•_while_")
|
/*md2.c*/ A(while,"•_while_")
|
||||||
|
|
||||||
|
enum PrimNumbers {
|
||||||
|
/* +-×÷⋆√⌊⌈|¬ */ n_add , n_sub , n_mul , n_div , n_pow , n_root , n_floor , n_ceil , n_stile , n_not,
|
||||||
|
/* ∧∨<>≠=≤≥≡≢ */ n_and , n_or , n_lt , n_gt , n_ne , n_eq , n_le , n_ge , n_feq , n_fne,
|
||||||
|
/* ⊣⊢⥊∾≍⋈↑↓↕« */ n_ltack , n_rtack , n_shape , n_join , n_couple , n_pair , n_take , n_drop , n_ud , n_shifta,
|
||||||
|
/* »⌽⍉/⍋⍒⊏⊑⊐⊒ */ n_shiftb , n_reverse, n_transp, n_slash, n_gradeUp, n_gradeDown, n_select, n_pick , n_indexOf, n_count,
|
||||||
|
/* ∊⍷⊔!˙˜˘¨⌜⁼ */ n_memberOf, n_find , n_group , n_asrt , n_const , n_swap , n_cell , n_each , n_tbl , n_undo,
|
||||||
|
/* ´˝`∘○⊸⟜⌾⊘◶ */ n_fold , n_reduce , n_scan , n_atop , n_over , n_before , n_after , n_under, n_val , n_cond,
|
||||||
|
/* ⎉⚇⍟⎊ */ n_cells , n_depth2 , n_repeat, n_catch
|
||||||
|
};
|
||||||
|
|
||||||
enum PrimFns { pf_none,
|
enum PrimFns { pf_none,
|
||||||
#define F(N,X) pf_##N,
|
#define F(N,X) pf_##N,
|
||||||
FOR_PFN(F,F,F)
|
FOR_PFN(F,F,F)
|
||||||
|
|||||||
@ -107,26 +107,26 @@ B scan_c1(Md1D* d, B x) { B f = d->f;
|
|||||||
u8 xe = TI(x,elType);
|
u8 xe = TI(x,elType);
|
||||||
if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) {
|
if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) {
|
||||||
u8 rtid = v(f)->flags-1;
|
u8 rtid = v(f)->flags-1;
|
||||||
if (rtid==0) { // +
|
if (rtid==n_add) { // +
|
||||||
if (ia<I32_MAX) \
|
if (ia<I32_MAX) \
|
||||||
if (xe==el_bit) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { c+= bitp_get(xp,i); rp[i]=c; } dec(x); return r; }
|
if (xe==el_bit) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { c+= bitp_get(xp,i); rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i16) { i16* xp=i16any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i16) { i16* xp=i16any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
||||||
}
|
}
|
||||||
if (rtid==7) { // ⌈
|
if (rtid==n_ceil) { // ⌈
|
||||||
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i8* rp; B r=m_i8arrv (&rp, ia); i8 c=I8_MIN ; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i8* rp; B r=m_i8arrv (&rp, ia); i8 c=I8_MIN ; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i16) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=I16_MIN; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i16) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=I16_MIN; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=I32_MIN; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=I32_MIN; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
||||||
}
|
}
|
||||||
if (rtid==14) { // ≠
|
if (rtid==n_ne) { // ≠
|
||||||
if (xe==el_bit) return scan_ne(0, x, ia);
|
if (xe==el_bit) return scan_ne(0, x, ia);
|
||||||
f64 x0 = IGetU(x,0).f; if (x0!=0 && x0!=1) goto base;
|
f64 x0 = IGetU(x,0).f; if (x0!=0 && x0!=1) goto base;
|
||||||
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
||||||
if (xe==el_i16) { i16* xp=i16any_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
if (xe==el_i16) { i16* xp=i16any_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
||||||
if (xe==el_i32) { i32* xp=i32any_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
if (xe==el_i32) { i32* xp=i32any_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
||||||
}
|
}
|
||||||
if (rtid==11) { // ∨
|
if (rtid==n_or) { // ∨
|
||||||
if (xe==el_bit) { u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=0; for (usz i=0; i<ia; i++) { c|= bitp_get(xp,i); bitp_set(rp,i,c); } dec(x); return r; }
|
if (xe==el_bit) { u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=0; for (usz i=0; i<ia; i++) { c|= bitp_get(xp,i); bitp_set(rp,i,c); } dec(x); return r; }
|
||||||
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=0; for (usz i=0; i<ia; i++) { if ((xp[i]&1)!=xp[i])goto base; c|=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=0; for (usz i=0; i<ia; i++) { if ((xp[i]&1)!=xp[i])goto base; c|=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
||||||
if (xe==el_i16) { i16* xp=i16any_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=0; for (usz i=0; i<ia; i++) { if ((xp[i]&1)!=xp[i])goto base; c|=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
if (xe==el_i16) { i16* xp=i16any_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=0; for (usz i=0; i<ia; i++) { if ((xp[i]&1)!=xp[i])goto base; c|=xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
||||||
@ -160,18 +160,18 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f;
|
|||||||
if (xr==1 && q_i32(w) && xe<el_f64 && isFun(f) && v(f)->flags) {
|
if (xr==1 && q_i32(w) && xe<el_f64 && isFun(f) && v(f)->flags) {
|
||||||
u8 rtid = v(f)->flags-1;
|
u8 rtid = v(f)->flags-1;
|
||||||
i32 wv = o2iu(w);
|
i32 wv = o2iu(w);
|
||||||
if (rtid==0) { // +
|
if (rtid==n_add) { // +
|
||||||
if (xe==el_bit) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; i<ia; i++) { c+= bitp_get(xp,i); rp[i]=c; } dec(x); return r; }
|
if (xe==el_bit) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; i<ia; i++) { c+= bitp_get(xp,i); rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i16) { i16* xp=i16any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i16) { i16* xp=i16any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if(addOn(c,xp[i]))goto base; rp[i]=c; } dec(x); return r; }
|
||||||
}
|
}
|
||||||
if (rtid==7) { // ⌈
|
if (rtid==n_ceil) { // ⌈
|
||||||
if (xe==el_i8 && wv==(i8 )wv) { i8* xp=i8any_ptr (x); i8* rp; B r=m_i8arrv (&rp, ia); i8 c=wv; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i8 && wv==(i8 )wv) { i8* xp=i8any_ptr (x); i8* rp; B r=m_i8arrv (&rp, ia); i8 c=wv; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i16 && wv==(i16)wv) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=wv; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i16 && wv==(i16)wv) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=wv; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
||||||
if (xe==el_i32 && wv==(i32)wv) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
if (xe==el_i32 && wv==(i32)wv) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; i<ia; i++) { if (xp[i]>c)c=xp[i]; rp[i]=c; } dec(x); return r; }
|
||||||
}
|
}
|
||||||
if (rtid==14) { // ≠
|
if (rtid==n_ne) { // ≠
|
||||||
if (!q_ibit(wv)) goto base; bool c=wv;
|
if (!q_ibit(wv)) goto base; bool c=wv;
|
||||||
if (xe==el_bit) return scan_ne(-(u64)wv, x, ia);
|
if (xe==el_bit) return scan_ne(-(u64)wv, x, ia);
|
||||||
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp, ia); for (usz i=0; i<ia; i++) { c^= xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
if (xe==el_i8 ) { i8* xp=i8any_ptr (x); u64* rp; B r=m_bitarrv(&rp, ia); for (usz i=0; i<ia; i++) { c^= xp[i]; bitp_set(rp,i,c); } dec(x); return r; }
|
||||||
@ -219,31 +219,31 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
|
|||||||
u8 xe = TI(x,elType);
|
u8 xe = TI(x,elType);
|
||||||
if (isFun(f) && v(f)->flags && xe<=el_f64) {
|
if (isFun(f) && v(f)->flags && xe<=el_f64) {
|
||||||
u8 rtid = v(f)->flags-1;
|
u8 rtid = v(f)->flags-1;
|
||||||
if (rtid==0) { // +
|
if (rtid==n_add) { // +
|
||||||
if (xe==el_bit) { B r = m_f64(bit_sum(bitarr_ptr(x), ia)); dec(x); return r; }
|
if (xe==el_bit) { B r = m_f64(bit_sum(bitarr_ptr(x), ia)); dec(x); return r; }
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=0; for (usz i=0; i<ia; i++) c+= xp[i]; dec(x); return m_f64(c); } // won't worry about 64TB array sum float inaccuracy for now
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=0; for (usz i=0; i<ia; i++) c+= xp[i]; dec(x); return m_f64(c); } // won't worry about 64TB array sum float inaccuracy for now
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=0; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=0; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=0; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=0; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
if (xe==el_f64) { f64* xp = f64any_ptr(x); f64 c=0; for (usz i=0; i<ia; i++) c+= xp[i]; dec(x); return m_f64(c); }
|
if (xe==el_f64) { f64* xp = f64any_ptr(x); f64 c=0; for (usz i=0; i<ia; i++) c+= xp[i]; dec(x); return m_f64(c); }
|
||||||
}
|
}
|
||||||
if (rtid==2 | rtid==10) { // ×/∧
|
if (rtid==n_mul | rtid==n_and) { // ×/∧
|
||||||
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=1; for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; dec(x);return m_i32(r); }
|
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=1; for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; dec(x);return m_i32(r); }
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=1; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_f64(c); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=1; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_f64(c); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=1; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=1; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=1; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=1; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
if (xe==el_f64) { f64* xp = f64any_ptr(x); f64 c=1; for (usz i=0; i<ia; i++) c*= xp[i]; dec(x); return m_f64(c); }
|
if (xe==el_f64) { f64* xp = f64any_ptr(x); f64 c=1; for (usz i=0; i<ia; i++) c*= xp[i]; dec(x); return m_f64(c); }
|
||||||
}
|
}
|
||||||
if (rtid==6) { // ⌊
|
if (rtid==n_floor) { // ⌊
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i8 c=I8_MAX ; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i8 c=I8_MAX ; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i16 c=I16_MAX; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i16 c=I16_MAX; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=I32_MAX; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=I32_MAX; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==7) { // ⌈
|
if (rtid==n_ceil) { // ⌈
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i8 c=I8_MIN ; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i8 c=I8_MIN ; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i16 c=I16_MIN; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i16 c=I16_MIN; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=I32_MIN; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=I32_MIN; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==11) { // ∨
|
if (rtid==n_or) { // ∨
|
||||||
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=0; for (usz i=0; i<(ia>>6); i++) if(xp[i]){r=1;break;} if(bitp_l0(xp,ia))r=1;dec(x); return m_i32(r); }
|
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=0; for (usz i=0; i<(ia>>6); i++) if(xp[i]){r=1;break;} if(bitp_l0(xp,ia))r=1;dec(x); return m_i32(r); }
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool r=0; for (usz i=0; i<ia; i++) { i8 c=xp[i]; if (c!=0&&c!=1)goto base; r|=c; } dec(x); return m_i32(r); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool r=0; for (usz i=0; i<ia; i++) { i8 c=xp[i]; if (c!=0&&c!=1)goto base; r|=c; } dec(x); return m_i32(r); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); bool r=0; for (usz i=0; i<ia; i++) { i16 c=xp[i]; if (c!=0&&c!=1)goto base; r|=c; } dec(x); return m_i32(r); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); bool r=0; for (usz i=0; i<ia; i++) { i16 c=xp[i]; if (c!=0&&c!=1)goto base; r|=c; } dec(x); return m_i32(r); }
|
||||||
@ -274,29 +274,29 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f;
|
|||||||
if (q_i32(w) && isFun(f) && v(f)->flags && xe<el_f64) {
|
if (q_i32(w) && isFun(f) && v(f)->flags && xe<el_f64) {
|
||||||
i32 wi = o2iu(w);
|
i32 wi = o2iu(w);
|
||||||
u8 rtid = v(f)->flags-1;
|
u8 rtid = v(f)->flags-1;
|
||||||
if (rtid==0) { // +
|
if (rtid==n_add) { // +
|
||||||
if (xe==el_bit) { B r = m_f64(wi + bit_sum(bitarr_ptr(x), ia)); dec(x); return r; }
|
if (xe==el_bit) { B r = m_f64(wi + bit_sum(bitarr_ptr(x), ia)); dec(x); return r; }
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=wi; for (usz i=0; i<ia; i++) c+=xp[i]; dec(x); return m_f64(c); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=wi; for (usz i=0; i<ia; i++) c+=xp[i]; dec(x); return m_f64(c); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==2 | rtid==10) { // ×/∧
|
if (rtid==n_mul | rtid==n_and) { // ×/∧
|
||||||
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=wi; if (r) { for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; } dec(x); return m_i32(r); }
|
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=wi; if (r) { for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; } dec(x); return m_i32(r); }
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (mulOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==6) { // ⌊
|
if (rtid==n_floor) { // ⌊
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==7) { // ⌈
|
if (rtid==n_ceil) { // ⌈
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==11 && (wi&1)==wi) { // ∨
|
if (rtid==n_or && (wi&1)==wi) { // ∨
|
||||||
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=wi; if (!r) { for (usz i=0; i<(ia>>6); i++) if(xp[i]){r=1;break;} if(bitp_l0(xp,ia))r=1; } dec(x); return m_i32(r); }
|
if (xe==el_bit) { u64* xp = bitarr_ptr(x); bool r=wi; if (!r) { for (usz i=0; i<(ia>>6); i++) if(xp[i]){r=1;break;} if(bitp_l0(xp,ia))r=1; } dec(x); return m_i32(r); }
|
||||||
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool q=wi; for (usz i=0; i<ia; i++) { i8 c=xp[i]; if (c!=0&&c!=1)goto base; q|=c; } dec(x); return m_i32(q); }
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool q=wi; for (usz i=0; i<ia; i++) { i8 c=xp[i]; if (c!=0&&c!=1)goto base; q|=c; } dec(x); return m_i32(q); }
|
||||||
if (xe==el_i16) { i16* xp = i16any_ptr(x); bool q=wi; for (usz i=0; i<ia; i++) { i16 c=xp[i]; if (c!=0&&c!=1)goto base; q|=c; } dec(x); return m_i32(q); }
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); bool q=wi; for (usz i=0; i<ia; i++) { i16 c=xp[i]; if (c!=0&&c!=1)goto base; q|=c; } dec(x); return m_i32(q); }
|
||||||
|
|||||||
@ -128,20 +128,20 @@ B shape_c2(B t, B w, B x) {
|
|||||||
}
|
}
|
||||||
if (bad && !good) thrM("⥊: 𝕨 too large");
|
if (bad && !good) thrM("⥊: 𝕨 too large");
|
||||||
if (unkPos!=-1) {
|
if (unkPos!=-1) {
|
||||||
if (unkInd!=53 & unkInd!=6 & unkInd!=31 & unkInd!=26) thrM("⥊: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑");
|
if (unkInd!=n_atop & unkInd!=n_floor & unkInd!=n_reverse & unkInd!=n_take) thrM("⥊: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑");
|
||||||
if (nia==0) thrM("⥊: Can't compute axis when the rest of the shape is empty");
|
if (nia==0) thrM("⥊: Can't compute axis when the rest of the shape is empty");
|
||||||
i64 div = xia/nia;
|
i64 div = xia/nia;
|
||||||
i64 mod = xia%nia;
|
i64 mod = xia%nia;
|
||||||
usz item;
|
usz item;
|
||||||
bool fill = false;
|
bool fill = false;
|
||||||
if (unkInd == 53) {
|
if (unkInd == n_atop) {
|
||||||
if (mod!=0) thrM("⥊: Shape must be exact when reshaping with ∘");
|
if (mod!=0) thrM("⥊: Shape must be exact when reshaping with ∘");
|
||||||
item = div;
|
item = div;
|
||||||
} else if (unkInd == 6) {
|
} else if (unkInd == n_floor) {
|
||||||
item = div;
|
item = div;
|
||||||
} else if (unkInd == 31) {
|
} else if (unkInd == n_reverse) {
|
||||||
item = mod? div+1 : div;
|
item = mod? div+1 : div;
|
||||||
} else if (unkInd == 26) {
|
} else if (unkInd == n_take) {
|
||||||
item = mod? div+1 : div;
|
item = mod? div+1 : div;
|
||||||
fill = true;
|
fill = true;
|
||||||
} else UD;
|
} else UD;
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#include "../core.h"
|
#include "../core.h"
|
||||||
#include "../nfns.h"
|
#include "../nfns.h"
|
||||||
|
#include "../builtins.h"
|
||||||
|
|
||||||
DEF_FREE(md1D) { dec(((Md1D*)x)->m1); dec(((Md1D*)x)->f); }
|
DEF_FREE(md1D) { dec(((Md1D*)x)->m1); dec(((Md1D*)x)->f); }
|
||||||
DEF_FREE(md2D) { dec(((Md2D*)x)->m2); dec(((Md2D*)x)->f); dec(((Md2D*)x)->g); }
|
DEF_FREE(md2D) { dec(((Md2D*)x)->m2); dec(((Md2D*)x)->f); dec(((Md2D*)x)->g); }
|
||||||
@ -67,7 +68,7 @@ static B toConstant(B x) { // doesn't consume x
|
|||||||
if (v(x)->type == t_md1D) {
|
if (v(x)->type == t_md1D) {
|
||||||
Md1D* d = c(Md1D,x);
|
Md1D* d = c(Md1D,x);
|
||||||
B m1 = d->m1;
|
B m1 = d->m1;
|
||||||
if (v(m1)->type==t_md1BI && v(m1)->flags==45) return inc(d->f);
|
if (v(m1)->type==t_md1BI && v(m1)->flags==n_const) return inc(d->f);
|
||||||
}
|
}
|
||||||
return bi_N;
|
return bi_N;
|
||||||
}
|
}
|
||||||
|
|||||||
38
src/load.c
38
src/load.c
@ -275,22 +275,22 @@ void load_init() { // very last init function
|
|||||||
HArr_p runtimeH = m_harrUc(rtObjRaw);
|
HArr_p runtimeH = m_harrUc(rtObjRaw);
|
||||||
SGet(rtObjRaw)
|
SGet(rtObjRaw)
|
||||||
|
|
||||||
rt_undo = Get(rtObjRaw, 49); gc_add(rt_undo);
|
rt_undo = Get(rtObjRaw, n_undo ); gc_add(rt_undo);
|
||||||
rt_select = Get(rtObjRaw, 36); gc_add(rt_select);
|
rt_select = Get(rtObjRaw, n_select ); gc_add(rt_select);
|
||||||
rt_slash = Get(rtObjRaw, 33); gc_add(rt_slash);
|
rt_slash = Get(rtObjRaw, n_slash ); gc_add(rt_slash);
|
||||||
rt_join = Get(rtObjRaw, 23); gc_add(rt_join);
|
rt_join = Get(rtObjRaw, n_join ); gc_add(rt_join);
|
||||||
rt_ud = Get(rtObjRaw, 28); gc_add(rt_ud);
|
rt_ud = Get(rtObjRaw, n_ud ); gc_add(rt_ud);
|
||||||
rt_pick = Get(rtObjRaw, 37); gc_add(rt_pick);
|
rt_pick = Get(rtObjRaw, n_pick ); gc_add(rt_pick);
|
||||||
rt_take = Get(rtObjRaw, 26); gc_add(rt_take);
|
rt_take = Get(rtObjRaw, n_take ); gc_add(rt_take);
|
||||||
rt_drop = Get(rtObjRaw, 27); gc_add(rt_drop);
|
rt_drop = Get(rtObjRaw, n_drop ); gc_add(rt_drop);
|
||||||
rt_group = Get(rtObjRaw, 42); gc_add(rt_group);
|
rt_group = Get(rtObjRaw, n_group ); gc_add(rt_group);
|
||||||
rt_under = Get(rtObjRaw, 57); gc_add(rt_under);
|
rt_under = Get(rtObjRaw, n_under ); gc_add(rt_under);
|
||||||
rt_reverse = Get(rtObjRaw, 31); gc_add(rt_reverse);
|
rt_reverse = Get(rtObjRaw, n_reverse ); gc_add(rt_reverse);
|
||||||
rt_indexOf = Get(rtObjRaw, 38); gc_add(rt_indexOf);
|
rt_indexOf = Get(rtObjRaw, n_indexOf ); gc_add(rt_indexOf);
|
||||||
rt_count = Get(rtObjRaw, 39); gc_add(rt_count);
|
rt_count = Get(rtObjRaw, n_count ); gc_add(rt_count);
|
||||||
rt_memberOf= Get(rtObjRaw, 40); gc_add(rt_memberOf);
|
rt_memberOf= Get(rtObjRaw, n_memberOf); gc_add(rt_memberOf);
|
||||||
rt_find = Get(rtObjRaw, 41); gc_add(rt_find);
|
rt_find = Get(rtObjRaw, n_find ); gc_add(rt_find);
|
||||||
rt_cell = Get(rtObjRaw, 46); gc_add(rt_cell);
|
rt_cell = Get(rtObjRaw, n_cell ); gc_add(rt_cell);
|
||||||
|
|
||||||
for (usz i = 0; i < rtLen; i++) {
|
for (usz i = 0; i < rtLen; i++) {
|
||||||
#ifdef RT_WRAP
|
#ifdef RT_WRAP
|
||||||
@ -343,12 +343,12 @@ void load_init() { // very last init function
|
|||||||
print_allocStats();
|
print_allocStats();
|
||||||
exit(0);
|
exit(0);
|
||||||
#else // use compiler
|
#else // use compiler
|
||||||
B prevAsrt = runtime[43];
|
B prevAsrt = runtime[n_asrt];
|
||||||
runtime[43] = bi_casrt; // horrible but GC is off so it's fiiiiiine
|
runtime[n_asrt] = bi_casrt; // horrible but GC is off so it's fiiiiiine
|
||||||
Block* comp_b = load_compImport(
|
Block* comp_b = load_compImport(
|
||||||
#include "gen/compiler"
|
#include "gen/compiler"
|
||||||
);
|
);
|
||||||
runtime[43] = prevAsrt;
|
runtime[n_asrt] = prevAsrt;
|
||||||
load_comp = m_funBlock(comp_b, 0); ptr_dec(comp_b);
|
load_comp = m_funBlock(comp_b, 0); ptr_dec(comp_b);
|
||||||
gc_add(load_comp);
|
gc_add(load_comp);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user