Make brute-force Mark Firsts store result in a register (always <64 elements)

This commit is contained in:
Marshall Lochbaum 2022-11-06 12:56:00 -05:00
parent 8560ce0f4d
commit 62867f4533

View File

@ -161,13 +161,14 @@ B memberOf_c1(B t, B x) {
} }
#define BRUTE(T) \ #define BRUTE(T) \
i##T* xp = xv; \ i##T* xp = xv; \
u64* rp; B r = m_bitarrv(&rp, n); bitp_set(rp, 0, 1); \ u64 rv = 1; \
for (usz i=1; i<n; i++) { \ for (usz i=1; i<n; i++) { \
bool c=1; i##T xi=xp[i]; \ bool c=1; i##T xi=xp[i]; \
for (usz j=0; j<i; j++) c &= xi!=xp[j]; \ PLAINLOOP for (usz j=0; j<i; j++) c &= xi!=xp[j]; \
bitp_set(rp, i, c); \ rv |= c<<i; \
} \ } \
decG(x); return r; decG(x); u64* rp; B r = m_bitarrv(&rp, n); rp[0] = rv; \
return r;
#define LOOKUP(T) \ #define LOOKUP(T) \
usz tn = 1<<T; \ usz tn = 1<<T; \
u##T* xp = (u##T*)xv; \ u##T* xp = (u##T*)xv; \
@ -243,7 +244,7 @@ B count_c1(B t, B x) {
i8* rp; B r = m_i8arrv(&rp, n); rp[0]=0; \ i8* rp; B r = m_i8arrv(&rp, n); rp[0]=0; \
for (usz i=1; i<n; i++) { \ for (usz i=1; i<n; i++) { \
usz c=0; i##T xi=xp[i]; \ usz c=0; i##T xi=xp[i]; \
for (usz j=0; j<i; j++) c += xi==xp[j]; \ PLAINLOOP for (usz j=0; j<i; j++) c += xi==xp[j]; \
rp[i] = c; \ rp[i] = c; \
} \ } \
decG(x); return r; decG(x); return r;
@ -354,7 +355,7 @@ B indexOf_c1(B t, B x) {
val -= dif; memset32(val, 0, dif); , \ val -= dif; memset32(val, 0, dif); , \
/*AUXCLEAR*/val[j] = 0;, /*AUXMOVE*/val[k] = val[j];) /*AUXCLEAR*/val[j] = 0;, /*AUXMOVE*/val[k] = val[j];)
if (lw==5) { if (lw==5) {
if (n<12) { BRUTE(32); } if (n<16) { BRUTE(32); }
B r; B r;
i32* rp; r = m_i32arrv(&rp, n); i32* rp; r = m_i32arrv(&rp, n);
i32* xp = tyany_ptr(x); i32* xp = tyany_ptr(x);