Use scan_max_num for sorted ⊒

This commit is contained in:
Marshall Lochbaum 2022-11-16 21:20:54 -05:00
parent 1924aee61c
commit 98d066c343
2 changed files with 13 additions and 12 deletions

View File

@ -102,16 +102,17 @@ B scan_add_bool(B x, u64 ia) { // consumes x
#endif
#define MM_CASE(T,N,C,I) \
case el_##T : { T* xp=T##any_ptr(x); T* rp; r=m_##T##arrv(&rp, ia); MINMAX_SCAN(T,N,C,I); break; }
#define MINMAX(NAME,C,INIT,ORD) \
B r; switch (xe) { default:UD; \
MM_CASE(i8 ,NAME,C,I8_##INIT ) \
MM_CASE(i16,NAME,C,I16_##INIT) \
MM_CASE(i32,NAME,C,I32_##INIT) \
MM_CASE(f64,NAME,C,F64_##INIT) \
} \
#define MINMAX(NAME,C,INIT,BIT,ORD) \
B r; switch (xe) { default:UD; \
case el_bit: return scan_##BIT(x, ia); \
MM_CASE(i8 ,NAME,C,I8_##INIT ) \
MM_CASE(i16,NAME,C,I16_##INIT) \
MM_CASE(i32,NAME,C,I32_##INIT) \
MM_CASE(f64,NAME,C,F64_##INIT) \
} \
decG(x); return FL_SET(r, fl_##ORD);
static B scan_min_num(B x, u8 xe, usz ia) { MINMAX(min,<,MAX,dsc) }
static B scan_max_num(B x, u8 xe, usz ia) { MINMAX(max,>,MIN,asc) }
B scan_min_num(B x, u8 xe, usz ia) { MINMAX(min,<,MAX,and,dsc) }
B scan_max_num(B x, u8 xe, usz ia) { MINMAX(max,>,MIN,or ,asc) }
#undef MM_CASE
#undef MINMAX
#undef MINMAX_SCAN

View File

@ -38,11 +38,11 @@
extern B not_c1(B, B);
extern B shape_c1(B, B);
extern B slash_c2(B, B, B);
extern B scan_c1(Md1D*, B);
extern B ud_c1(B, B);
extern B sub_c2(B, B, B);
extern B mul_c2(B, B, B);
extern B scan_add_bool(B x, u64 ia);
extern B scan_max_num(B x, u8 xe, u64 ia);
// These hashes are stored in tables and must be invertible!
#if defined(__SSE4_2__)
@ -327,8 +327,8 @@ B count_c1(B t, B x) {
if (use_sorted(x, lw) && n>16 && (lw>4 || n<1<<16)) { // ↕∘≠(⊣-⌈`∘×)∊
B c = shift_ne(x, n, lw, 1);
B i = C1(ud, m_f64(n));
B m = M1C1(scan, ceil, C2(mul, c, inc(i)));
return C2(sub, i, m);
B m = C2(mul, c, inc(i));
return C2(sub, i, scan_max_num(m, TI(m,elType), n));
}
void* xv = tyany_ptr(x);
#define BRUTE(T) \