Fast boolean =´ and ≠´
This commit is contained in:
parent
37312f7a03
commit
27943b85f4
@ -121,6 +121,12 @@ B scan_ne(u64 p, u64* xp, u64 ia) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool fold_ne(u64* x, u64 am) {
|
||||||
|
u64 r = 0;
|
||||||
|
for (u64 i = 0; i < (am>>6); i++) r^= x[i];
|
||||||
|
if (am&63) r^= x[am>>6]<<(64-am & 63);
|
||||||
|
return POPC(r) & 1;
|
||||||
|
}
|
||||||
static i64 bit_diff(u64* x, u64 am) {
|
static i64 bit_diff(u64* x, u64 am) {
|
||||||
i64 r = 0;
|
i64 r = 0;
|
||||||
u64 a = 0xAAAAAAAAAAAAAAAA;
|
u64 a = 0xAAAAAAAAAAAAAAAA;
|
||||||
@ -284,6 +290,8 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
|
|||||||
if (rtid==n_sub) { B r = m_f64(bit_diff(xp, ia)); decG(x); return r; }
|
if (rtid==n_sub) { B r = m_f64(bit_diff(xp, ia)); decG(x); return r; }
|
||||||
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { 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_and | rtid==n_mul | rtid==n_floor) { 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 ) { 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 (rtid==n_or | rtid==n_ceil ) { 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 (rtid==n_ne) { bool r=fold_ne(xp, ia) ; decG(x); return m_i32(r); }
|
||||||
|
if (rtid==n_eq) { bool r=fold_ne(xp, ia) ^ (1&~ia); decG(x); return m_i32(r); }
|
||||||
goto base;
|
goto base;
|
||||||
}
|
}
|
||||||
if (rtid==n_add) { // +
|
if (rtid==n_add) { // +
|
||||||
@ -345,6 +353,8 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f;
|
|||||||
if (wi!=(wi&1)) goto base;
|
if (wi!=(wi&1)) goto base;
|
||||||
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { 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_and | rtid==n_mul | rtid==n_floor) { 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 ) { 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 (rtid==n_or | rtid==n_ceil ) { 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 (rtid==n_ne) { bool r=wi^fold_ne(xp, ia) ; decG(x); return m_i32(r); }
|
||||||
|
if (rtid==n_eq) { bool r=wi^fold_ne(xp, ia) ^ (1&ia); decG(x); return m_i32(r); }
|
||||||
goto base;
|
goto base;
|
||||||
}
|
}
|
||||||
if (rtid==n_add) { // +
|
if (rtid==n_add) { // +
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user