diff --git a/src/builtins/md1.c b/src/builtins/md1.c index f8b504c4..703731bc 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -142,14 +142,19 @@ B scan_c1(Md1D* d, B x) { B f = d->f; u8 xe = TI(x,elType); if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; - if (rtid==n_add) { // + - if (xe==el_bit && iaf; 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; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } } if (rtid==n_ne) { // ≠ - if (xe==el_bit) return scan_ne(0, x, ia); 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; if; if (xr==1 && q_i32(w) && xeflags) { u8 rtid = v(f)->flags-1; i32 wv = o2iu(w); + if (xe==el_bit) { + if (rtid==n_add) { u64* xp=bitarr_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; if; } if (rtid==n_ne) { // ≠ if (!q_ibit(wv)) goto base; bool c=wv; - 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; if; u8 xe = TI(x,elType); if (isFun(f) && v(f)->flags && xe<=el_f64) { u8 rtid = v(f)->flags-1; + if (xe==el_bit) { + if (rtid==n_add) { B r = m_f64(bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } + if (rtid==n_and | rtid==n_mul | rtid==n_floor) { 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; decG(x); return m_i32(r); } + if (rtid==n_or | rtid==n_ceil ) { 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; decG(x); return m_i32(r); } + goto base; + } if (rtid==n_add) { // + - if (xe==el_bit) { B r = m_f64(bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=0; for (usz i=0; i>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; decG(x);return m_i32(r); } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=1; for (usz i=0; if; if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=I32_MIN; for (usz i=0; ic) c=xp[i]; decG(x); return m_i32(c); } } 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;decG(x); return m_i32(r); } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool r=0; for (usz i=0; if; if (q_i32(w) && isFun(f) && v(f)->flags && xeflags-1; + if (xe==el_bit) { + if (rtid==n_add) { B r = m_f64(wi + bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } + if (wi!=(wi&1)) goto base; + if (rtid==n_and | rtid==n_mul | rtid==n_floor) { 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; } decG(x); return m_i32(r); } + if (rtid==n_or | rtid==n_ceil ) { 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; } decG(x); return m_i32(r); } + goto base; + } if (rtid==n_add) { // + - if (xe==el_bit) { B r = m_f64(wi + bit_sum(bitarr_ptr(x), ia)); decG(x); return r; } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=wi; for (usz i=0; i>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; } decG(x); return m_i32(r); } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; if; if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; ic) c=xp[i]; decG(x); return m_i32(c); } } 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; } decG(x); return m_i32(r); } if (xe==el_i8 ) { i8* xp = i8any_ptr (x); bool q=wi; for (usz i=0; i