From 3a50cda5d3d23ce87341be1919b693dfcfe308a0 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Fri, 10 Nov 2023 15:41:57 -0500 Subject: [PATCH] Specialize Index-of tables on result type --- src/builtins/search.c | 32 +++++++++++++++++++++----------- src/builtins/selfsearch.c | 5 +++-- src/singeli/src/bins.singeli | 2 +- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/builtins/search.c b/src/builtins/search.c index d8d88a1e..61a626d6 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -17,10 +17,12 @@ // p⊐n & n∊p with boolean p: based on ⊑p and p⊐¬⊑p // p⊐n & n∊p with short p: // AVX2 binary search when applicable +// SHOULD apply vector binary search to characters (sort as ints) // n⊸=¨p otherwise // ≤16-bit elements: lookup tables // 8-bit ∊ and ⊐: SSSE3 table // SHOULD make 8-bit NEON table +// SHOULD have branchy reverse 16-bit table search // 32- or 64-bit elements: hash tables // Store hash in table and not element; Robin Hood ordering; resizing // Reverse hash if searched-for is shorter @@ -35,9 +37,12 @@ #include "../utils/talloc.h" #include "../utils/calls.h" -// From selfsearch.c -extern NOINLINE void memset32(u32* p, u32 v, usz l); -extern NOINLINE void memset64(u64* p, u64 v, usz l); +extern NOINLINE void memset16(u16* p, u16 v, usz l) { for (usz i=0; i=32 && wia>1 && el_i8<=xe && xe<=el_i32 && wia<64>>(xe-el_i8) && we<=xe && !elChr(TI(x,elType))) { + if (xia>=32 && wia>1 && el_i8<=xe && xe<=el_i32 && wia<(xe==el_i8?64:16) && we<=xe && !elChr(TI(x,elType))) { B g = C1(reverse, C1(gradeDown, incG(w))); w = C2(select, incG(g), w); switch (xe) { default:UD; case el_i8:w=toI8Any(w);break; case el_i16:w=toI16Any(w);break; case el_i32:w=toI32Any(w);break; } @@ -304,21 +309,26 @@ B indexOf_c2(B t, B w, B x) { } if (xia+wia>20 && we<=el_i16 && xe<=el_i16) { + B r; #if SINGELI if (wia>256 && we==el_i8 && xe==el_i8) { TALLOC(u8, tab, 256*(1+sizeof(usz))); usz* ind = (usz*)(tab+256); void* fp = tyany_ptr(x); simd_index_tab_u8(tyany_ptr(w), wia, fp, xia, tab, ind); decG(w); - i32* rp; B r = m_i32arrc(&rp, x); - for (usz i=0; i