From 85d27ddc832d122ea997fd6f4ec3434bc63d9259 Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 4 Oct 2021 11:08:38 +0300 Subject: [PATCH] =?UTF-8?q?fast=20=F0=9D=95=A8=E2=89=A0`=F0=9D=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/grade.h | 4 ++-- src/builtins/md1.c | 33 +++++++++++++++++---------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 55c07d5a..8662b817 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -34,7 +34,7 @@ B GRADE_CAT(c1)(B t, B x) { i32 min=-128, range=256; TALLOC(usz, tmp, range+1); for (i64 i = 0; i < range+1; i++) tmp[i] = 0; - GRADE_UD( + GRADE_UD( // i8 range-based for (usz i = 0; i < ia; i++) (tmp-min+1)[xp[i]]++; for (i64 i = 1; i < range; i++) tmp[i]+= tmp[i-1]; for (usz i = 0; i < ia; i++) rp[(tmp-min)[xp[i]]++] = i; @@ -58,7 +58,7 @@ B GRADE_CAT(c1)(B t, B x) { if (range/2 < ia) { TALLOC(usz, tmp, range+1); for (i64 i = 0; i < range+1; i++) tmp[i] = 0; - GRADE_UD( + GRADE_UD( // i32 range-based for (usz i = 0; i < ia; i++) (tmp-min+1)[xp[i]]++; for (i64 i = 1; i < range; i++) tmp[i]+= tmp[i-1]; for (usz i = 0; i < ia; i++) rp[(tmp-min)[xp[i]]++] = i; diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 20640b1a..8de109c9 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -85,6 +85,18 @@ B each_c2(Md1D* d, B w, B x) { B f = d->f; return homFil2(f, eachd(f, w, x), wf, xf); } +B scan_ne(u64 p, B x, u64 ia) { + u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); + 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; +} B scan_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || rnk(x)==0) thrM("`: Argument cannot have rank 0"); @@ -108,18 +120,7 @@ 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; - } + 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 (rtid==14) { // ≠ if (!q_ibit(wv)) goto base; bool c=wv; - if (xe==el_bit) { u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp, ia); for (usz i=0; i