From 7d56d6123594813777b7cfa6b177bcab34b7b463 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 6 Nov 2022 16:05:13 -0500 Subject: [PATCH] =?UTF-8?q?Hash=20table=20for=20Occurrence=20Count=20(?= =?UTF-8?q?=E2=8A=92)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/selfsearch.c | 40 +++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/builtins/selfsearch.c b/src/builtins/selfsearch.c index 2e0a1d0f..cde95793 100644 --- a/src/builtins/selfsearch.c +++ b/src/builtins/selfsearch.c @@ -144,6 +144,15 @@ static NOINLINE void memset64(u64* p, u64 v, usz l) { for (usz i=0; i=(1<<14)? 3 : 5) // Radix-assisted lookup usz rx = 256, tn = 1<<16; // Radix; table length u32* v0 = (u32*)xv; - i32* r0; B r = m_i32arrv(&r0, n); + i32* r0 = rp; TALLOC(u8, alloc, 6*n+(4+4*(tn>n?tn:n)+(2*rx+1)*sizeof(usz))); // timeline @@ -284,6 +303,13 @@ B count_c1(B t, B x) { RADIX_LOOKUP_32(0, ++) return num_squeeze(r); } + if (lw == 6 && canCompare64_norm(x, n)) { + if (n<20) { BRUTE(64); } + i32* rp; B r = m_i32arrv(&rp, n); + HASHTAB(u64, 64, 0, n, sz==msz? 0 : sz>=(1<<18)? 0 : sz>=(1<<14)? 3 : 5) + decG(r); // Fall through + } + #undef HASHTAB #undef BRUTE if (RNK(x)>1) x = toCells(x); @@ -341,18 +367,12 @@ B indexOf_c1(B t, B x) { if (lw==4) { if (n<12) { BRUTE(16); } else { LOOKUP(16); } } #undef LOOKUP - #define HASHTAB(T, W, THRESH) SELFHASHTAB(T, W, 0, 2*n, \ + #define HASHTAB(T, W, THRESH) SELFHASHTAB_VAL(T, W, 0, 2*n, \ /*RES0*/0, /*RESULT*/r, \ /* RESWRITE */ \ if (k!=h) { val[j]=ctr++; hash[j]=h; } rp[i]=val[j]; , \ /*THRESHMUL*/2, THRESH, \ - /*AUXSIZE*/sizeof(u32), \ - /* AUXINIT */ \ - u32* val = (u32*)(hash+sz+ext) + msz-sz; \ - memset32(val, 0, sz+ext); \ - u32 ctr = 1; , \ - /*AUXEXTEND*/val -= dif; memset32(val, 0, dif); , \ - /*AUXMOVE*/u32 v = val[j]; val[j] = 0; val[k] = v;) + /*INIT*/u32 ctr = 1;) if (lw==5) { if (n<12) { BRUTE(32); } B r;