From 136c1afacc97596e3179efa5d5edf63baed89eae Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Wed, 16 Nov 2022 20:49:57 -0500 Subject: [PATCH] Macro-ize integer min/max scan and add sorted flag --- src/builtins/grade.h | 12 +++---- src/builtins/scan.c | 66 ++++++++++++++++++++---------------- src/builtins/slash.c | 4 +-- src/singeli/src/scan.singeli | 12 +++---- 4 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index f59f73ec..66d9e66f 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -31,22 +31,22 @@ } #if SINGELI -extern void (*const avx2_scan_max8)(int8_t* v0,int8_t* v1,uint64_t v2); -extern void (*const avx2_scan_min8)(int8_t* v0,int8_t* v1,uint64_t v2); -extern void (*const avx2_scan_max16)(int16_t* v0,int16_t* v1,uint64_t v2); -extern void (*const avx2_scan_min16)(int16_t* v0,int16_t* v1,uint64_t v2); +extern void (*const avx2_scan_max_i8)(int8_t* v0,int8_t* v1,uint64_t v2); +extern void (*const avx2_scan_min_i8)(int8_t* v0,int8_t* v1,uint64_t v2); +extern void (*const avx2_scan_max_i16)(int16_t* v0,int16_t* v1,uint64_t v2); +extern void (*const avx2_scan_min_i16)(int16_t* v0,int16_t* v1,uint64_t v2); #define COUNT_THRESHOLD 32 #define WRITE_SPARSE_i8 \ for (usz i=0; i>63); // repeat sign bit } #endif - return r; + decG(x); return r; } -static B scan_or(B x, u64 ia) { +static B scan_or(B x, u64 ia) { // consumes x u64* xp = bitarr_ptr(x); u64* rp; B r=m_bitarrv(&rp,ia); usz n=BIT_N(ia); u64 xi; usz i=0; - while (i,MIN,asc) } +#undef MM_CASE +#undef MINMAX +#undef MINMAX_SCAN + B scan_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("`: Argument cannot have rank 0"); ur xr = RNK(x); @@ -97,8 +125,8 @@ B scan_c1(Md1D* d, B x) { B f = d->f; u64* xp=bitarr_ptr(x); if (rtid==n_add ) return scan_add_bool(x, ia); if (rtid==n_or | rtid==n_ceil ) return scan_or(x, ia); - if (rtid==n_and | rtid==n_mul | rtid==n_floor) { u64* rp; B r=m_bitarrv(&rp,ia); usz n=BIT_N(ia); u64 xi; usz i=0; while(if; if (xe==el_i16) { i16* xp=i16any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } - if (xe==el_i16) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=I16_MIN; for (usz i=0; ic)c=xp[i]; rp[i]=c; } decG(x); return r; } - 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; } decG(x); return r; } - #endif - } + if (rtid==n_floor && xef; if (xe==el_bit) { u64* xp=bitarr_ptr(x); if (rtid==n_add) { i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; i