squeeze result of ⊒𝕩, copy result of ⊐𝕩 to smaller width when possible
This commit is contained in:
parent
ae4c4a03ee
commit
ea0aa709fe
@ -61,7 +61,7 @@ static NOINLINE B2 splitCells(B n, B p, u8 mode) { // 0:∊ 1:⊐ 2:⊒
|
|||||||
#undef SYMB
|
#undef SYMB
|
||||||
}
|
}
|
||||||
|
|
||||||
static B reduceWidth(B r, usz count) {
|
static B reduceI32Width(B r, usz count) {
|
||||||
return count<=I8_MAX? taga(cpyI8Arr(r)) : count<=I16_MAX? taga(cpyI16Arr(r)) : r;
|
return count<=I8_MAX? taga(cpyI8Arr(r)) : count<=I16_MAX? taga(cpyI16Arr(r)) : r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ B indexOf_c2(B t, B w, B x) {
|
|||||||
if (xia+wia>20 && we<=el_i16 && xe<=el_i16) {
|
if (xia+wia>20 && we<=el_i16 && xe<=el_i16) {
|
||||||
B r;
|
B r;
|
||||||
TABLE(w, x, i32, wia, i)
|
TABLE(w, x, i32, wia, i)
|
||||||
return reduceWidth(r, wia);
|
return reduceI32Width(r, wia);
|
||||||
}
|
}
|
||||||
i32* rp; B r = m_i32arrc(&rp, x);
|
i32* rp; B r = m_i32arrc(&rp, x);
|
||||||
H_b2i* map = m_b2i(64);
|
H_b2i* map = m_b2i(64);
|
||||||
@ -139,7 +139,7 @@ B indexOf_c2(B t, B w, B x) {
|
|||||||
}
|
}
|
||||||
for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, GetU(x,i), wia);
|
for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, GetU(x,i), wia);
|
||||||
free_b2i(map); decG(w); decG(x);
|
free_b2i(map); decG(w); decG(x);
|
||||||
return reduceWidth(r, wia);
|
return reduceI32Width(r, wia);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,7 +266,7 @@ B count_c2(B t, B w, B x) {
|
|||||||
free_b2i(map);
|
free_b2i(map);
|
||||||
}
|
}
|
||||||
TFREE(wnext); decG(w); decG(x);
|
TFREE(wnext); decG(w); decG(x);
|
||||||
return reduceWidth(r, wia);
|
return reduceI32Width(r, wia);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -244,7 +244,7 @@ B memberOf_c1(B t, B x) {
|
|||||||
else for (usz j=0; j<tn; j++) tab[j]=1; \
|
else for (usz j=0; j<tn; j++) tab[j]=1; \
|
||||||
for (usz i=0; i<n; i++) { u##T j=xp[i]; rp[i]=tab[j]; tab[j]=0; } \
|
for (usz i=0; i<n; i++) { u##T j=xp[i]; rp[i]=tab[j]; tab[j]=0; } \
|
||||||
decG(x); TFREE(tab); \
|
decG(x); TFREE(tab); \
|
||||||
return num_squeeze(r)
|
return taga(cpyBitArr(r))
|
||||||
if (lw == 3) { if (n<8) { BRUTE(8); } else { LOOKUP(8); } }
|
if (lw == 3) { if (n<8) { BRUTE(8); } else { LOOKUP(8); } }
|
||||||
if (lw == 4) { if (n<8) { BRUTE(16); } else { LOOKUP(16); } }
|
if (lw == 4) { if (n<8) { BRUTE(16); } else { LOOKUP(16); } }
|
||||||
#undef LOOKUP
|
#undef LOOKUP
|
||||||
@ -403,7 +403,11 @@ B count_c1(B t, B x) {
|
|||||||
rp[i] = had? ++map->a[p].val : (map->a[p].val = 0);
|
rp[i] = had? ++map->a[p].val : (map->a[p].val = 0);
|
||||||
}
|
}
|
||||||
decG(x); free_b2i(map);
|
decG(x); free_b2i(map);
|
||||||
return r;
|
return num_squeeze(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
static B reduceI32WidthBelow(B r, usz after) {
|
||||||
|
return after<=2? taga(cpyBitArr(r)) : after<=I8_MAX+1? taga(cpyI8Arr(r)) : after<=I16_MAX+1? taga(cpyI16Arr(r)) : r;
|
||||||
}
|
}
|
||||||
|
|
||||||
B indexOf_c1(B t, B x) {
|
B indexOf_c1(B t, B x) {
|
||||||
@ -431,7 +435,7 @@ B indexOf_c1(B t, B x) {
|
|||||||
rp[i]=s; u+=u==s; \
|
rp[i]=s; u+=u==s; \
|
||||||
} \
|
} \
|
||||||
decG(x); TFREE(uniq); return r;
|
decG(x); TFREE(uniq); return r;
|
||||||
#define DOTAB(T) \
|
#define DOTAB(T) /*leaves 1+max in u */ \
|
||||||
i32 u=0; \
|
i32 u=0; \
|
||||||
for (usz i=0; i<n; i++) { \
|
for (usz i=0; i<n; i++) { \
|
||||||
T j=xp[i]; i32 t=tab[j]; \
|
T j=xp[i]; i32 t=tab[j]; \
|
||||||
@ -476,7 +480,7 @@ B indexOf_c1(B t, B x) {
|
|||||||
DOTAB(i32)
|
DOTAB(i32)
|
||||||
TFREE(tmp);
|
TFREE(tmp);
|
||||||
decG(x);
|
decG(x);
|
||||||
return r;
|
return reduceI32WidthBelow(r, u);
|
||||||
}
|
}
|
||||||
HASHTAB(u32, 32, sz==msz? 0 : sz>=(1<<18)? 1 : sz>=(1<<14)? 4 : 6)
|
HASHTAB(u32, 32, sz==msz? 0 : sz>=(1<<18)? 1 : sz>=(1<<14)? 4 : 6)
|
||||||
decG(r); // Fall through
|
decG(r); // Fall through
|
||||||
@ -503,7 +507,7 @@ B indexOf_c1(B t, B x) {
|
|||||||
else rp[i] = map->a[p].val = ctr++;
|
else rp[i] = map->a[p].val = ctr++;
|
||||||
}
|
}
|
||||||
free_b2i(map); decG(x);
|
free_b2i(map); decG(x);
|
||||||
return r;
|
return reduceI32WidthBelow(r, ctr);
|
||||||
}
|
}
|
||||||
|
|
||||||
B find_c1(B t, B x) {
|
B find_c1(B t, B x) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user