more comparison type fixing
and some more / opt to make it not slower
This commit is contained in:
parent
99896fbace
commit
0bcf3b592f
@ -75,7 +75,7 @@ B repeat_replace(B g, B* q) { // doesn't consume
|
|||||||
} \
|
} \
|
||||||
i64 bound[2] = {0,0}; \
|
i64 bound[2] = {0,0}; \
|
||||||
repeat_bounds(bound, g); \
|
repeat_bounds(bound, g); \
|
||||||
u64 min=(u64)-bound[0]; u64 max=(u64)bound[1]; \
|
i64 min=(u64)-bound[0]; i64 max=(u64)bound[1]; \
|
||||||
TALLOC(B, all, min+max+1); \
|
TALLOC(B, all, min+max+1); \
|
||||||
B* q = all+min; \
|
B* q = all+min; \
|
||||||
q[0] = inc(x); \
|
q[0] = inc(x); \
|
||||||
@ -86,11 +86,11 @@ B repeat_replace(B g, B* q) { // doesn't consume
|
|||||||
dec(x2); \
|
dec(x2); \
|
||||||
dec(fi); \
|
dec(fi); \
|
||||||
} \
|
} \
|
||||||
for (u64 i = 0; i < max; i++) q[i+1] = inc(x = CN(f, __VA_ARGS__ x)); \
|
for (i64 i = 0; i < max; i++) q[i+1] = inc(x = CN(f, __VA_ARGS__ x)); \
|
||||||
dec(x); \
|
dec(x); \
|
||||||
B r = repeat_replace(g, q); \
|
B r = repeat_replace(g, q); \
|
||||||
dec(g); \
|
dec(g); \
|
||||||
for (u64 i = 0; i < min+max+1; i++) dec(all[i]); \
|
for (i64 i = 0; i < min+max+1; i++) dec(all[i]); \
|
||||||
END; TFREE(all); \
|
END; TFREE(all); \
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|||||||
@ -208,7 +208,7 @@ B slash_c1(B t, B x) {
|
|||||||
if (TI(x,elType)==el_i32) {
|
if (TI(x,elType)==el_i32) {
|
||||||
i32* xp = i32any_ptr(x);
|
i32* xp = i32any_ptr(x);
|
||||||
while (xia>0 && !xp[xia-1]) xia--;
|
while (xia>0 && !xp[xia-1]) xia--;
|
||||||
for (i32 i = 0; i < xia; i++) {
|
for (u64 i = 0; i < xia; i++) {
|
||||||
i32 c = xp[i];
|
i32 c = xp[i];
|
||||||
if (LIKELY(c==0 || c==1)) {
|
if (LIKELY(c==0 || c==1)) {
|
||||||
*rp = i;
|
*rp = i;
|
||||||
@ -284,8 +284,8 @@ B slash_c2(B t, B w, B x) {
|
|||||||
for (usz i = 0; i < wia; i++) {
|
for (usz i = 0; i < wia; i++) {
|
||||||
i32 cw = wp[i];
|
i32 cw = wp[i];
|
||||||
if (cw==0) continue;
|
if (cw==0) continue;
|
||||||
B cx = xgetU(x, i);
|
B cx = incBy(xgetU(x, i), cw);
|
||||||
for (i64 j = 0; j < cw; j++) r.a[ri++] = inc(cx);
|
for (i64 j = 0; j < cw; j++) r.a[ri++] = cx;
|
||||||
}
|
}
|
||||||
dec(w); dec(x);
|
dec(w); dec(x);
|
||||||
return withFill(harr_fv(r), xf);
|
return withFill(harr_fv(r), xf);
|
||||||
@ -299,8 +299,8 @@ B slash_c2(B t, B w, B x) {
|
|||||||
for (usz i = 0; i < wia; i++) {
|
for (usz i = 0; i < wia; i++) {
|
||||||
usz c = o2s(wgetU(w, i));
|
usz c = o2s(wgetU(w, i));
|
||||||
if (c) {
|
if (c) {
|
||||||
B cx = xgetU(x, i);
|
B cx = incBy(xgetU(x, i), c);
|
||||||
for (usz j = 0; j < c; j++) r.a[ri++] = inc(cx);
|
for (usz j = 0; RARE(j < c); j++) *r.a++ = cx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dec(w); dec(x);
|
dec(w); dec(x);
|
||||||
@ -316,12 +316,11 @@ B slash_c2(B t, B w, B x) {
|
|||||||
arr_shVec(r,0);
|
arr_shVec(r,0);
|
||||||
return taga(r);
|
return taga(r);
|
||||||
}
|
}
|
||||||
usz ri = 0;
|
|
||||||
if (TI(x,elType)==el_i32) {
|
if (TI(x,elType)==el_i32) {
|
||||||
i32* xp = i32any_ptr(x);
|
i32* xp = i32any_ptr(x);
|
||||||
i32* rp; B r = m_i32arrv(&rp, xia*wv);
|
i32* rp; B r = m_i32arrv(&rp, xia*wv);
|
||||||
for (usz i = 0; i < xia; i++) {
|
for (usz i = 0; i < xia; i++) {
|
||||||
for (usz j = 0; j < wv; j++) rp[ri++] = xp[i];
|
for (i64 j = 0; j < wv; j++) *rp++ = xp[i];
|
||||||
}
|
}
|
||||||
dec(x);
|
dec(x);
|
||||||
return r;
|
return r;
|
||||||
@ -330,8 +329,8 @@ B slash_c2(B t, B w, B x) {
|
|||||||
HArr_p r = m_harrUv(xia*wv);
|
HArr_p r = m_harrUv(xia*wv);
|
||||||
BS2B xgetU = TI(x,getU);
|
BS2B xgetU = TI(x,getU);
|
||||||
for (usz i = 0; i < xia; i++) {
|
for (usz i = 0; i < xia; i++) {
|
||||||
B cx = xgetU(x, i);
|
B cx = incBy(xgetU(x, i), wv);
|
||||||
for (usz j = 0; j < wv; j++) r.a[ri++] = inc(cx);
|
for (i64 j = 0; j < wv; j++) *r.a++ = cx;
|
||||||
}
|
}
|
||||||
dec(x);
|
dec(x);
|
||||||
return withFill(r.b, xf);
|
return withFill(r.b, xf);
|
||||||
|
|||||||
@ -225,7 +225,7 @@ B rand_range_c2(B t, B w, B x) {
|
|||||||
f64* rp; r = m_f64arrv(&rp, am);
|
f64* rp; r = m_f64arrv(&rp, am);
|
||||||
for (usz i = 0; i < am; i++) rp[i] = wy2u01(wyrand(&seed));
|
for (usz i = 0; i < am; i++) rp[i] = wy2u01(wyrand(&seed));
|
||||||
} else if (max > I32_MAX) {
|
} else if (max > I32_MAX) {
|
||||||
if (max >= 1ULL<<53) thrM("(rand).Range: 𝕩 must be less than 2⋆53");
|
if (max >= 1LL<<53) thrM("(rand).Range: 𝕩 must be less than 2⋆53");
|
||||||
f64* rp; r = m_f64arrv(&rp, am);
|
f64* rp; r = m_f64arrv(&rp, am);
|
||||||
for (usz i = 0; i < am; i++) rp[i] = wy2u0k(wyrand(&seed), max);
|
for (usz i = 0; i < am; i++) rp[i] = wy2u0k(wyrand(&seed), max);
|
||||||
} else {
|
} else {
|
||||||
@ -281,12 +281,12 @@ B rand_deal_c2(B t, B w, B x) {
|
|||||||
i64 sz = 1;
|
i64 sz = 1;
|
||||||
while (sz < wi*2) sz*= 2;
|
while (sz < wi*2) sz*= 2;
|
||||||
TALLOC(i32, hash, 2*sz); i32* val = hash+1;
|
TALLOC(i32, hash, 2*sz); i32* val = hash+1;
|
||||||
for (u64 i = 0; i < 2*sz; i++) hash[i] = 0;
|
for (i64 i = 0; i < 2*sz; i++) hash[i] = 0;
|
||||||
for (i64 i = 0; i < wi; i++) rp[i] = i;
|
for (i64 i = 0; i < wi; i++) rp[i] = i;
|
||||||
u64 mask = 2*(sz-1);
|
u64 mask = 2*(sz-1);
|
||||||
for (i64 i = 0; i < wi; i++) {
|
for (i64 i = 0; i < wi; i++) {
|
||||||
u64 j = wy2u0k(wyrand(&seed), xi-i) + i;
|
u64 j = wy2u0k(wyrand(&seed), xi-i) + i;
|
||||||
if (j<wi) {
|
if (j<(u64)wi) {
|
||||||
i32 c = rp[j];
|
i32 c = rp[j];
|
||||||
rp[j] = rp[i];
|
rp[j] = rp[i];
|
||||||
rp[i] = c;
|
rp[i] = c;
|
||||||
@ -297,7 +297,7 @@ B rand_deal_c2(B t, B w, B x) {
|
|||||||
p&= mask;
|
p&= mask;
|
||||||
i32 h = hash[p];
|
i32 h = hash[p];
|
||||||
if (h==0) { hash[p] = j; break; }
|
if (h==0) { hash[p] = j; break; }
|
||||||
if (h==j) { prev = val[p]; break; }
|
if ((u64)h==j) { prev = val[p]; break; }
|
||||||
p+= 2;
|
p+= 2;
|
||||||
}
|
}
|
||||||
val[p] = rp[i];
|
val[p] = rp[i];
|
||||||
@ -320,7 +320,7 @@ B rand_subset_c2(B t, B w, B x) {
|
|||||||
B r;
|
B r;
|
||||||
if (wi==xi) { // Only one complete subset; will hang without this
|
if (wi==xi) { // Only one complete subset; will hang without this
|
||||||
i32* rp; r = m_i32arrv(&rp, wi);
|
i32* rp; r = m_i32arrv(&rp, wi);
|
||||||
for (u64 i = 0; i < wi; i++) rp[i] = i;
|
for (i64 i = 0; i < wi; i++) rp[i] = i;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
RAND_START;
|
RAND_START;
|
||||||
@ -329,20 +329,20 @@ B rand_subset_c2(B t, B w, B x) {
|
|||||||
TALLOC(u8, set, xi);
|
TALLOC(u8, set, xi);
|
||||||
bool invert = wi > xi/2;
|
bool invert = wi > xi/2;
|
||||||
i32 wn = invert ? xi-wi : wi;
|
i32 wn = invert ? xi-wi : wi;
|
||||||
for (u64 i = 0; i < xi; i++) set[i] = 0;
|
for (i64 i = 0; i < xi; i++) set[i] = 0;
|
||||||
for (i32 i = xi-wn; i < xi; i++) {
|
for (i32 i = xi-wn; i < xi; i++) {
|
||||||
i32 j = wy2u0k(wyrand(&seed), i+1);
|
i32 j = wy2u0k(wyrand(&seed), i+1);
|
||||||
if (set[j]) j=i;
|
if (set[j]) j=i;
|
||||||
set[j] = 1;
|
set[j] = 1;
|
||||||
}
|
}
|
||||||
i32* rp; r = m_i32arrv(&rp, wi);
|
i32* rp; r = m_i32arrv(&rp, wi);
|
||||||
if (!invert) { for (u64 i = 0; i < xi; i++) if ( set[i]) *rp++=i; }
|
if (!invert) { for (i64 i = 0; i < xi; i++) if ( set[i]) *rp++=i; }
|
||||||
else { for (u64 i = 0; i < xi; i++) if (!set[i]) *rp++=i; }
|
else { for (i64 i = 0; i < xi; i++) if (!set[i]) *rp++=i; }
|
||||||
TFREE(set);
|
TFREE(set);
|
||||||
} else {
|
} else {
|
||||||
// Sorted "hash" set
|
// Sorted "hash" set
|
||||||
u64 sh = 0;
|
u64 sh = 0;
|
||||||
for (u64 xt=xi/4; xt>=wi; xt>>=1) sh++;
|
for (u64 xt=xi/4; xt>=(u64)wi; xt>>=1) sh++;
|
||||||
u64 sz = ((xi-1)>>sh)+1 + wi;
|
u64 sz = ((xi-1)>>sh)+1 + wi;
|
||||||
TALLOC(i32, hash, sz);
|
TALLOC(i32, hash, sz);
|
||||||
for (u64 i = 0; i < sz; i++) hash[i] = xi;
|
for (u64 i = 0; i < sz; i++) hash[i] = xi;
|
||||||
|
|||||||
@ -22,7 +22,7 @@ static void gsReserve(u64 am) {
|
|||||||
gStackEnd = gStackStart+n;
|
gStackEnd = gStackStart+n;
|
||||||
}
|
}
|
||||||
#elif DEBUG
|
#elif DEBUG
|
||||||
if (am>gStackEnd-gStack) thrM("Stack overflow");
|
if ((i64)am > gStackEnd-gStack) thrM("Stack overflow");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
src/h.h
4
src/h.h
@ -422,6 +422,10 @@ static B inc(B x) {
|
|||||||
if (isVal(VALIDATE(x))) v(x)->refc++;
|
if (isVal(VALIDATE(x))) v(x)->refc++;
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
static B incBy(B x, i64 am) {
|
||||||
|
if (isVal(VALIDATE(x))) v(x)->refc+= am;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
static void ptr_inc(void* x) { VALIDATEP((Value*)x)->refc++; }
|
static void ptr_inc(void* x) { VALIDATEP((Value*)x)->refc++; }
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -376,7 +376,7 @@ static OptRes opt(u32* bc0) {
|
|||||||
TSADDA(rbc, sbc, ebc-sbc);
|
TSADDA(rbc, sbc, ebc-sbc);
|
||||||
}
|
}
|
||||||
u64 added = TSSIZE(rbc)-psz;
|
u64 added = TSSIZE(rbc)-psz;
|
||||||
for (i32 i = 0; i < added; i++) TSADD(roff, sbc-bc0);
|
for (u64 i = 0; i < added; i++) TSADD(roff, sbc-bc0);
|
||||||
#undef A64
|
#undef A64
|
||||||
if (ret) break;
|
if (ret) break;
|
||||||
bc = ebc;
|
bc = ebc;
|
||||||
|
|||||||
@ -129,7 +129,7 @@ int main(int argc, char* argv[]) {
|
|||||||
args = emptySVec();
|
args = emptySVec();
|
||||||
} else {
|
} else {
|
||||||
HArr_p ap = m_harrUv(argc-i); // eh whatever, erroring will exit anyways
|
HArr_p ap = m_harrUv(argc-i); // eh whatever, erroring will exit anyways
|
||||||
for (usz j = 0; j < argc-i; j++) {
|
for (i64 j = 0; j < argc-i; j++) {
|
||||||
ap.a[j] = fromUTF8l(argv[i+j]);
|
ap.a[j] = fromUTF8l(argv[i+j]);
|
||||||
}
|
}
|
||||||
args = ap.b;
|
args = ap.b;
|
||||||
|
|||||||
2
src/ns.c
2
src/ns.c
@ -41,7 +41,7 @@ B ns_getU(B ns, B cNL, i32 nameID) { VTY(ns, t_ns);
|
|||||||
NS* n = c(NS, ns);
|
NS* n = c(NS, ns);
|
||||||
NSDesc* d = n->desc;
|
NSDesc* d = n->desc;
|
||||||
i32 dVarAm = d->varAm;
|
i32 dVarAm = d->varAm;
|
||||||
assert(nameID<a(cNL)->ia && nameID>=0);
|
assert((u64)nameID < a(cNL)->ia && nameID>=0);
|
||||||
B dNL = d->nameList;
|
B dNL = d->nameList;
|
||||||
if (cNL.u != dNL.u) {
|
if (cNL.u != dNL.u) {
|
||||||
B cName = TI(cNL,getU)(cNL, nameID);
|
B cName = TI(cNL,getU)(cNL, nameID);
|
||||||
|
|||||||
10
src/vm.c
10
src/vm.c
@ -217,7 +217,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
|
|||||||
i32 mpsc = 0;
|
i32 mpsc = 0;
|
||||||
if (depth==0 && sc && vam > sc->varAm) {
|
if (depth==0 && sc && vam > sc->varAm) {
|
||||||
if (boIA==2) thrM("VM compiler: Full block info must be provided for extending scopes");
|
if (boIA==2) thrM("VM compiler: Full block info must be provided for extending scopes");
|
||||||
i32 regAm = sc->varAm;
|
u32 regAm = sc->varAm;
|
||||||
ScopeExt* oE = sc->ext;
|
ScopeExt* oE = sc->ext;
|
||||||
if (oE==NULL || vam > regAm+oE->varAm) {
|
if (oE==NULL || vam > regAm+oE->varAm) {
|
||||||
i32 nSZ = vam - regAm;
|
i32 nSZ = vam - regAm;
|
||||||
@ -311,7 +311,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
|
|||||||
m_nsDesc(body, imm, ty, inc(nameList), biGetU(bodyRepr,2), biGetU(bodyRepr,3));
|
m_nsDesc(body, imm, ty, inc(nameList), biGetU(bodyRepr,2), biGetU(bodyRepr,3));
|
||||||
} else {
|
} else {
|
||||||
body->nsDesc = NULL;
|
body->nsDesc = NULL;
|
||||||
for (i32 i = 0; i < vam; i++) body->varIDs[i] = -1;
|
for (u64 i = 0; i < vam; i++) body->varIDs[i] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSADD(bodies, body);
|
TSADD(bodies, body);
|
||||||
@ -697,7 +697,7 @@ Scope* m_scope(Body* body, Scope* psc, u16 varAm, i32 initVarAm, B* initVars) {
|
|||||||
static void scope_dec(Scope* sc) {
|
static void scope_dec(Scope* sc) {
|
||||||
i32 varAm = sc->varAm;
|
i32 varAm = sc->varAm;
|
||||||
if (sc->refc>1) {
|
if (sc->refc>1) {
|
||||||
usz innerRef = 1;
|
i32 innerRef = 1;
|
||||||
for (i32 i = 0; i < varAm; i++) {
|
for (i32 i = 0; i < varAm; i++) {
|
||||||
B c = sc->vars[i];
|
B c = sc->vars[i];
|
||||||
if (isVal(c) && v(c)->refc==1) {
|
if (isVal(c) && v(c)->refc==1) {
|
||||||
@ -958,8 +958,8 @@ NOINLINE B vm_fmtPoint(B src, B prepend, B path, usz cs, usz ce) { // consumes p
|
|||||||
ce-= srcS;
|
ce-= srcS;
|
||||||
ACHR('\n');
|
ACHR('\n');
|
||||||
for (i64 i = padStart; i < padEnd; i++) ACHR(' ');
|
for (i64 i = padStart; i < padEnd; i++) ACHR(' ');
|
||||||
for (i32 i = 0; i < cs; i++) ACHR(o2cu(srcGetU(src, srcS+i))=='\t'? '\t' : ' '); // ugh tabs
|
for (u64 i = 0; i < cs; i++) ACHR(o2cu(srcGetU(src, srcS+i))=='\t'? '\t' : ' '); // ugh tabs
|
||||||
for (i32 i = cs; i < ce; i++) ACHR('^');
|
for (u64 i = cs; i < ce; i++) ACHR('^');
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user