diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 2ddff559..8b84e15d 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -108,8 +108,19 @@ B scan_c1(Md1D* d, B x) { B f = d->f; 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; } dec(x); return r; } } if (rtid==14) { // ≠ + if (xe==el_bit) { u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); + u64 p = 0; + for (usz i = 0; i < BIT_N(ia); i++) { + u64 c = xp[i]; + u64 r = c ^ (c<<1); + r^= r<< 2; r^= r<< 4; r^= r<<8; + r^= r<<16; r^= r<<32; r^= p; + rp[i] = r; + p = -(r>>63); // repeat sign bit + } + dec(x); return r; + } f64 x0 = IGetU(x,0).f; if (x0!=0 && x0!=1) goto base; - if (xe==el_bit) { u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); bool c=x0; rp[0]=c; for (usz i=1; i> 6) +#define BIT_N(IA) (((IA)+63) >> 6) // u64 count needed to store IA bits static inline void bitp_set(u64* arr, u64 n, bool v) { u64 m = ((u64)1)<<(n&63);