diff --git a/src/builtins/slash.c b/src/builtins/slash.c index 4dbff005..d7953e57 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -477,21 +477,26 @@ static B compress(B w, B x, usz wia, u8 xl, u8 xt) { } \ TFREE(buf) #define COMPRESS_BLOCK(T) COMPRESS_BLOCK_PREP(T, ) + #if SINGELI_AVX2 + #define THR(C) C + #else + #define THR(C) 2 + #endif #define WITH_SPARSE(W, CUTOFF, DENSE) { \ i##W *xp=tyany_ptr(x), *rp; \ - if (wsum=wia/8 && groups_lt(wp,wia, wia/16)) r = compress_grouped(wp, x, wia, wsum, xt); \ else { T* xp=tyany_ptr(x); T* rp=m_tyarrv(&r,sizeof(T),wsum,xt); COMPRESS_BLOCK(T); } - #if SINGELI_AVX2 && FAST_PDEP - case 3: WITH_SPARSE( 8, 32, rp=m_tyarrv(&r,1,wsum,xt); bmipopc_2slash8 (wp, xp, rp, wia, wsum)) - case 4: WITH_SPARSE(16, 16, rp=m_tyarrv(&r,2,wsum,xt); bmipopc_2slash16(wp, xp, rp, wia, wsum)) - case 5: WITH_SPARSE(32, 32, rp=m_tyarrv(&r,4,wsum,xt); avx2_2slash32 (wp, xp, rp, wia, wsum)) + #if SINGELI + case 3: WITH_SPARSE( 8, 32, rp=m_tyarrv(&r,1,wsum,xt); si_2slash8 (wp, xp, rp, wia, wsum)) + case 4: WITH_SPARSE(16, 16, rp=m_tyarrv(&r,2,wsum,xt); si_2slash16(wp, xp, rp, wia, wsum)) + case 5: WITH_SPARSE(32, 32, rp=m_tyarrv(&r,4,wsum,xt); si_2slash32(wp, xp, rp, wia, wsum)) case 6: if (TI(x,elType)!=el_B) { - WITH_SPARSE(64, 16, rp=m_tyarrv(&r,8,wsum,xt); avx2_2slash64 (wp, xp, rp, wia, wsum)) + WITH_SPARSE(64, 16, rp=m_tyarrv(&r,8,wsum,xt); si_2slash64(wp, xp, rp, wia, wsum)) } // else follows #else case 3: WITH_SPARSE( 8, 2, rp=m_tyarrv(&r,1,wsum,xt); for (usz i=0; i>6} >> (n&63)) & 1 + @for (x over i to l) { + store{r, 0, x} + r+= bitp_get{w,i} + } +} + def comp8{w:*u64, X, r:*i8, l:u64, sum:u64} = { @for_special_buffered{r,8} (w in *u8~~w over sum) { pc:= popc{w} @@ -198,15 +207,13 @@ fn slash2{T & hasarch{if (width{T}>=32) 'AVX512F' else 'AVX512VBMI2'}}(w:*u64, x } if (hasarch{'BMI2'}) { -export{'bmipopc_2slash8', slash2{i8}} -export{'bmipopc_2slash16', slash2{i16}} export{'bmipopc_1slash8', slash1{i8}} export{'bmipopc_1slash16', slash1{i16}} } -if (hasarch{'AVX2'}) { -export{'avx2_2slash32', slash2{i32}} -export{'avx2_2slash64', slash2{i64}} -} +export{'si_2slash8', slash2{i8}} +export{'si_2slash16', slash2{i16}} +export{'si_2slash32', slash2{i32}} +export{'si_2slash64', slash2{i64}} # pext, or boolean compress fn pext{T}(x:T, m:T) {