From 464dd27a37b42f00043b7c1e4622d5ca2533801a Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 29 Apr 2023 10:50:51 -0400 Subject: [PATCH] SIMD table intialization for Index-of --- src/builtins/search.c | 12 +++++++++ src/singeli/src/search.singeli | 47 ++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/builtins/search.c b/src/builtins/search.c index 2e903ece..9708325d 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -226,6 +226,18 @@ B indexOf_c2(B t, B w, B x) { } if (xia+wia>20 && we<=el_i16 && xe<=el_i16) { + #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; i64) k=64 rw:u64 = 0 @for (x over j to k) { - new:= settab{u64, x} + new:= settab{u64, x, i*64+j} # Index usually unused if (rbit) rw|= new & ((u64~~1)< 0} - # Initialize rev:u1 = nx < nw/4 # Reverse lookup bittab_init{tab, -promote{i8,rev}} u:u8 = 0 # Sum of table, either 0 or 256 if (rev) u = fill_bittab(x0, nx, tab, u, 0) - # Fill table u = fill_bittab(w0, nw, tab, u, -1) - # Read result if (u == 0) { # All found! @for (r in *u64~~r0 over cdiv{nx,64}) r = maxvalue{u64} } else { @@ -267,6 +269,17 @@ fn simd_member_u8(w0:*void, nw:u64, x0:*void, nx:u64, r0:*void, tab:*void) : voi } } +fn simd_index_tab_u8{I}(w0:*void, nw:u64, x0:*void, nx:u64, tab:*void, i0:*void) : void = { + rev:u1 = nx < nw/4 + bittab_init{tab, -promote{i8,rev}} + ind:= *I~~i0 + @for (ind over 256) ind = cast_i{I, nw} + u:u8 = 0 + if (rev) u = fill_bittab(x0, nx, tab, u, 0) + do_bittab{w0, nw, tab, u, -1, 'index', ind} +} + export{'simd_mark_firsts_u8', simd_mark_firsts_u8} export{'simd_deduplicate_u8', simd_deduplicate_u8} export{'simd_member_u8', simd_member_u8} +export{'simd_index_tab_u8', simd_index_tab_u8{usz}}