non-reusing i32arr→i32arr ⌜

This commit is contained in:
dzaima 2021-04-09 23:37:13 +03:00
parent 21412be6c5
commit da095a0ff4

View File

@ -8,30 +8,52 @@ B tbl_c1(B d, B x) { B f = c(Md1D,d)->f;
usz i = 0; usz i = 0;
B cr = c1(f, xget(x,0)); B cr = c1(f, xget(x,0));
HArr_p rH; HArr_p rH;
if (reusable(x) && TI(x).canStore(cr)) { if (TI(x).canStore(cr)) {
bool reuse = reusable(x);
if (v(x)->type==t_harr) { if (v(x)->type==t_harr) {
B* p = harr_ptr(x); B* xp = harr_ptr(x);
p[i++] = cr; if (reuse) {
for (; i < ia; i++) p[i] = c1(f, p[i]); xp[i++] = cr;
for (; i < ia; i++) xp[i] = c1(f, xp[i]);
return x; return x;
} else {
HArr_p rp = m_harrc(x);
rp.a[i++] = cr;
for (; i < ia; i++) rp.a[i] = c1(f, inc(xp[i]));
dec(x);
return rp.b;
}
} else if (v(x)->type==t_i32arr) { } else if (v(x)->type==t_i32arr) {
i32* p = i32arr_ptr(x); i32* xp = i32arr_ptr(x);
p[i++] = o2iu(cr); B r = reuse? x : m_i32arrc(x);
i32* rp = i32arr_ptr(r);
rp[i++] = o2iu(cr);
for (; i < ia; i++) { for (; i < ia; i++) {
cr = c1(f, m_i32(p[i])); cr = c1(f, m_i32(xp[i]));
if (!q_i32(cr)) { if (!q_i32(cr)) {
rH = m_harrc(x); rH = m_harrc(x);
for (usz j = 0; j < i; j++) rH.a[j] = m_i32(p[j]); for (usz j = 0; j < i; j++) rH.a[j] = m_i32(rp[j]);
if (!reuse) dec(r);
goto fallback; goto fallback;
} }
p[i] = o2iu(cr); rp[i] = o2iu(cr);
} }
return x; if (!reuse) dec(x);
return r;
} else if (v(x)->type==t_fillarr) { } else if (v(x)->type==t_fillarr) {
B* p = fillarr_ptr(x); B* xp = fillarr_ptr(x);
p[i++] = cr; if (reuse) {
for (; i < ia; i++) p[i] = c1(f, p[i]); c(FillArr,x)->fill = bi_noFill;
xp[i++] = cr;
for (; i < ia; i++) xp[i] = c1(f, xp[i]);
return x; return x;
} else {
HArr_p rp = m_harrc(x);
rp.a[i++] = cr;
for (; i < ia; i++) rp.a[i] = c1(f, inc(xp[i]));
dec(x);
return rp.b;
}
} else rH = m_harrc(x); } else rH = m_harrc(x);
} else rH = m_harrc(x); } else rH = m_harrc(x);
fallback: fallback: