typed 𝔽`

This commit is contained in:
dzaima 2021-09-10 19:19:04 +03:00
parent 1022910b33
commit e55aa352f0

View File

@ -92,35 +92,25 @@ B scan_c1(Md1D* d, B x) { B f = d->f;
usz ia = a(x)->ia; usz ia = a(x)->ia;
if (ia==0) return x; if (ia==0) return x;
B xf = getFillQ(x); B xf = getFillQ(x);
if (xr==1 && TI(x,elType)==el_i32 && isFun(f) && v(f)->flags) { u8 xe = TI(x,elType);
if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) {
u8 rtid = v(f)->flags-1; u8 rtid = v(f)->flags-1;
i32* xp = i32any_ptr(x);
if (rtid==0) { // + if (rtid==0) { // +
i32* rp; B r = m_i32arrv(&rp, ia); if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i16 c=0; for (usz i=0; i<ia; i++) { if(__builtin_add_overflow(c,xp[i],&c))goto base; rp[i]=c; } dec(x); return r; }
i64 c = 0; 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(__builtin_add_overflow(c,xp[i],&c))goto base; rp[i]=c; } dec(x); return r; }
for (usz i = 0; i < ia; i++) { 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(__builtin_add_overflow(c,xp[i],&c))goto base; rp[i]=c; } dec(x); return r; }
rp[i] = c+= xp[i];
if (c>I32_MAX) { dec(r); goto base; }
}
dec(x);
return r;
} }
if (rtid==7) { // ⌈ if (rtid==7) { // ⌈
i32* rp; B r = m_i32arrv(&rp, ia); 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; }
i32 c = I32_MIN; 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; }
for (usz i = 0; i < ia; i++) { 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 (xp[i]>c) c = xp[i];
rp[i] = c;
}
dec(x);
return r;
} }
if (rtid==14) { // ≠ if (rtid==14) { // ≠
i32* rp; B r = m_i32arrv(&rp, ia); f64 x0 = IGetU(x,0).f;
i32 c = 0; if (x0 != (i8)x0) goto base;
for (usz i = 0; i < ia; i++) rp[i] = c = c!=xp[i]; if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i8* rp; B r=m_i8arrv(&rp, ia); i8 c=(i8)x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; rp[i]=c; } dec(x); return r; }
dec(x); if (xe==el_i16) { i16* xp=i16any_ptr(x); i8* rp; B r=m_i8arrv(&rp, ia); i8 c=(i8)x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; rp[i]=c; } dec(x); return r; }
return r; if (xe==el_i32) { i32* xp=i32any_ptr(x); i8* rp; B r=m_i8arrv(&rp, ia); i8 c=(i8)x0; rp[0]=c; for (usz i=1; i<ia; i++) { c = c!=xp[i]; rp[i]=c; } dec(x); return r; }
} }
} }
base:; base:;
@ -220,11 +210,13 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
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 (__builtin_add_overflow(c,xp[i],&c))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 (__builtin_add_overflow(c,xp[i],&c))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 (__builtin_add_overflow(c,xp[i],&c))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 (__builtin_add_overflow(c,xp[i],&c))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 (rtid==2 | rtid==10) { // ×/∧ if (rtid==2 | rtid==10) { // ×/∧
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=1; for (usz i=0; i<ia; i++) if (__builtin_mul_overflow(c,xp[i],&c))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 (__builtin_mul_overflow(c,xp[i],&c))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 (__builtin_mul_overflow(c,xp[i],&c))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 (__builtin_mul_overflow(c,xp[i],&c))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 (__builtin_mul_overflow(c,xp[i],&c))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 (__builtin_mul_overflow(c,xp[i],&c))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 (rtid==6) { // ⌊ if (rtid==6) { // ⌊
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); }
@ -262,7 +254,7 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f;
if (isAtm(x) || rnk(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x); if (isAtm(x) || rnk(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x);
usz ia = a(x)->ia; usz ia = a(x)->ia;
u8 xe = TI(x,elType); u8 xe = TI(x,elType);
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==0) { // +