fast ∧´
This commit is contained in:
parent
f0c6671ec0
commit
573b97f60b
@ -226,6 +226,7 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
|
||||
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 (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_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); }
|
||||
@ -242,7 +243,7 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
|
||||
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 (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;} r|= !!bitp_l0(xp,ia);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_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_i32) { i32* xp = i32any_ptr(x); bool r=0; for (usz i=0; i<ia; i++) { i32 c=xp[i]; if (c!=0&&c!=1)goto base; r|=c; } dec(x); return m_i32(r); }
|
||||
|
||||
@ -31,6 +31,9 @@ static inline bool bitp_get(u64* arr, u64 n) {
|
||||
static inline u64 bitp_l0(u64* arr, u64 ia) { // last u64 of the array, with the tail set to 0s
|
||||
return ia&63? arr[ia>>6]&((1ULL<<(ia&63))-1) : 0;
|
||||
}
|
||||
static inline u64 bitp_l1(u64* arr, u64 ia) { // last u64 of the array, with the tail set to 1s
|
||||
return ia&63? arr[ia>>6]|~((1ULL<<(ia&63))-1) : ~0ULL;
|
||||
}
|
||||
static inline u64 bitx(B x) { // repeats the boolean across all 64 bits
|
||||
return o2bu(x)? ~(u64)0 : 0;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user