From 98d066c343e10d859c054a19e22a0aeb51d2c499 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Wed, 16 Nov 2022 21:20:54 -0500 Subject: [PATCH] =?UTF-8?q?Use=20scan=5Fmax=5Fnum=20for=20sorted=20?= =?UTF-8?q?=E2=8A=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/scan.c | 19 ++++++++++--------- src/builtins/selfsearch.c | 6 +++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/builtins/scan.c b/src/builtins/scan.c index 617c3457..c036254b 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -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 diff --git a/src/builtins/selfsearch.c b/src/builtins/selfsearch.c index ba26fd9f..b1733a21 100644 --- a/src/builtins/selfsearch.c +++ b/src/builtins/selfsearch.c @@ -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) \