diff --git a/src/builtins/search.c b/src/builtins/search.c index 1d1d9331..72ce9875 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -101,6 +101,28 @@ B memberOf_c2(B t, B w, B x) { } #undef WEQ // TODO O(wiaƗxia) for small wia + if (xia+wia>20 && we<=el_i16 && xe<=el_i16 && we!=el_bit) { + usz xt = 1<<(8*elWidth(xe)); // Range of x writes + usz wt = 1<<(8*elWidth(we)); // Range of w lookups + usz t = xt>wt? xt : wt; // Table allocation width + void* wp = tyany_ptr(w); + void* xp = tyany_ptr(x); + usz m=wia, n=xia; + i8* rp; B r = m_i8arrv(&rp, m); + TALLOC(u8, tab0, t); u8* tab = tab0 + t/2; + // Initialize + if (we==el_i16 && m