From 2207d9f1bbd3c41bed9900c200b914daa8a87534 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 22 Oct 2022 16:01:45 -0400 Subject: [PATCH] =?UTF-8?q?Combine=20monadic=20=E2=88=8A=20and=20=E2=8A=90?= =?UTF-8?q?=20radix=20lookups=20with=20a=20macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/selfsearch.c | 79 ++++++++++++++------------------------- 1 file changed, 29 insertions(+), 50 deletions(-) diff --git a/src/builtins/selfsearch.c b/src/builtins/selfsearch.c index f523298b..e40b3ab0 100644 --- a/src/builtins/selfsearch.c +++ b/src/builtins/selfsearch.c @@ -6,6 +6,32 @@ B not_c1(B t, B x); B shape_c1(B t, B x); +#define RADIX_LOOKUP_i32(INIT, SETTAB) \ + /* Count keys */ \ + for (usz j=0; j<2*rx; j++) c0[j] = 0; \ + for (usz i=0; i>24)]++; c1[(u8)(v>>16)]++; } \ + /* Exclusive prefix sum */ \ + usz s0=0, s1=0; \ + for (usz j=0; j>24); usz c=c0[k]++; v1[c]=v; } \ + for (usz i=0; i>16); usz c=c1[k]++; v2[c]=v; } \ + /* Table lookup */ \ + u32 tv=v2[0]>>16; v2[n]=~v2[n-1]; \ + for (usz l=0, i=0; l>16; if (tv!=t0) break; tab[(u16)v]=INIT; } \ + for (; i>24)]++; c1[(u8)(v>>16)]++; } - // Exclusive prefix sum - usz s0=0, s1=0; - for (usz j=0; j>24); usz c=c0[k]++; v1[c]=v; } - for (usz i=0; i>16); usz c=c1[k]++; v2[c]=v; } - // Table lookup - u32 tv=v2[0]>>16; v2[n]=~v2[n-1]; - for (usz l=0, i=0; l>16; if (tv!=t0) break; tab[(u16)v]=1; } - for (; in?tn:n)+(2*rx+1)*sizeof(usz))); - // timeline // Allocations len count radix hash deradix bytes layout: usz *c0 = (usz*)(alloc)+1; // rx [+++................] c0 rx # @@ -151,30 +153,7 @@ B count_c1(B t, B x) { u32 *r1 = (u32*)v1; // n [+..] r1 4*n ######## u32 *tab= (u32*)v1; // tn [+] tab 4*tn ########### - // Count keys - for (usz j=0; j<2*rx; j++) c0[j] = 0; - for (usz i=0; i>24)]++; c1[(u8)(v>>16)]++; } - // Exclusive prefix sum - usz s0=0, s1=0; - for (usz j=0; j>24); usz c=c0[k]++; v1[c]=v; } - for (usz i=0; i>16); usz c=c1[k]++; v2[c]=v; } - // Table lookup - u32 tv=v2[0]>>16; v2[n]=~v2[n-1]; - for (usz l=0, i=0; l>16; if (tv!=t0) break; tab[(u16)v]=0; } - for (; i