split up eq_c2
This commit is contained in:
parent
4d85a57e10
commit
6740e680a9
22
src/arith.c
22
src/arith.c
@ -79,26 +79,16 @@ B decp_c1(B t, B x);
|
|||||||
B eq_c2(B t, B w, B x) {
|
B eq_c2(B t, B w, B x) {
|
||||||
if(isF64(w)&isF64(x)) return m_i32(w.f==x.f);
|
if(isF64(w)&isF64(x)) return m_i32(w.f==x.f);
|
||||||
P2(eq);
|
P2(eq);
|
||||||
if (w.u==x.u) { dec(w);dec(x); return m_i32(1); }
|
B r = m_i32(atomEqual(w, x));
|
||||||
// doesn't handle int=float
|
dec(w); dec(x);
|
||||||
if (!isVal(w) | !isVal(x)) { dec(w);dec(x); return m_i32(0); }
|
return r;
|
||||||
if (v(w)->type!=v(x)->type) { dec(w);dec(x); return m_i32(0); }
|
|
||||||
B2B dcf = TI(w).decompose;
|
|
||||||
if (dcf == def_decompose) { dec(w);dec(x); return m_i32(0); }
|
|
||||||
w=dcf(w); B* wp = harr_ptr(w);
|
|
||||||
x=dcf(x); B* xp = harr_ptr(x);
|
|
||||||
if (o2i(wp[0])<=1) { dec(w);dec(x); return m_i32(0); }
|
|
||||||
usz wia = a(w)->ia;
|
|
||||||
usz xia = a(x)->ia;
|
|
||||||
if (wia != xia) { dec(w);dec(x); return m_i32(0); }
|
|
||||||
for (i32 i = 0; i<wia; i++) if(!equal(wp[i], xp[i]))
|
|
||||||
{ dec(w);dec(x); return m_i32(0); }
|
|
||||||
dec(w);dec(x); return m_i32(1);
|
|
||||||
}
|
}
|
||||||
B ne_c2(B t, B w, B x) {
|
B ne_c2(B t, B w, B x) {
|
||||||
if(isF64(w)&isF64(x)) return m_i32(w.f!=x.f);
|
if(isF64(w)&isF64(x)) return m_i32(w.f!=x.f);
|
||||||
P2(ne);
|
P2(ne);
|
||||||
return m_i32(1-o2i(eq_c2(t,w,x)));
|
B r = m_i32(!atomEqual(w, x));
|
||||||
|
dec(w); dec(x);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -141,13 +141,13 @@ void validateFill(B x) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
B fill_or(B wf, B xf) { // consumes
|
B fill_or(B wf, B xf) { // consumes
|
||||||
if (!equal(wf, xf)) {
|
if (wf.u==xf.u || equal(wf, xf)) {
|
||||||
dec(wf); dec(xf);
|
|
||||||
return bi_noFill;
|
|
||||||
}
|
|
||||||
dec(wf);
|
dec(wf);
|
||||||
return xf;
|
return xf;
|
||||||
}
|
}
|
||||||
|
dec(wf); dec(xf);
|
||||||
|
return bi_noFill;
|
||||||
|
}
|
||||||
|
|
||||||
B fill_both(B w, B x) { // doesn't consume
|
B fill_both(B w, B x) { // doesn't consume
|
||||||
B wf = getFill(inc(w));
|
B wf = getFill(inc(w));
|
||||||
|
|||||||
2
src/h.h
2
src/h.h
@ -217,6 +217,7 @@ void arr_print(B x); // doesn't consume
|
|||||||
u8 fillElType(B x); // doesn't consume
|
u8 fillElType(B x); // doesn't consume
|
||||||
bool eqShape(B w, B x); // doesn't consume
|
bool eqShape(B w, B x); // doesn't consume
|
||||||
usz arr_csz(B x); // doesn't consume
|
usz arr_csz(B x); // doesn't consume
|
||||||
|
bool atomEqual(B w, B x); // doesn't consume
|
||||||
bool eqShPrefix(usz* w, usz* x, ur len);
|
bool eqShPrefix(usz* w, usz* x, ur len);
|
||||||
|
|
||||||
B m_v1(B a ); // consumes all
|
B m_v1(B a ); // consumes all
|
||||||
@ -355,6 +356,7 @@ void slice_free(B x) { dec(c(Slice,x)->p); decSh(x); }
|
|||||||
void slice_visit(B x) { mm_visit(c(Slice,x)->p); }
|
void slice_visit(B x) { mm_visit(c(Slice,x)->p); }
|
||||||
void slice_print(B x) { arr_print(x); }
|
void slice_print(B x) { arr_print(x); }
|
||||||
|
|
||||||
|
B* harr_ptr(B x);
|
||||||
|
|
||||||
|
|
||||||
typedef void (*B2v)(B);
|
typedef void (*B2v)(B);
|
||||||
|
|||||||
@ -59,6 +59,7 @@ void BN(free)(Value* x) {
|
|||||||
#ifdef USE_VALGRIND
|
#ifdef USE_VALGRIND
|
||||||
VALGRIND_MAKE_MEM_UNDEFINED(x, BSZ(x->mmInfo&63));
|
VALGRIND_MAKE_MEM_UNDEFINED(x, BSZ(x->mmInfo&63));
|
||||||
VALGRIND_MAKE_MEM_DEFINED(&x->mmInfo, 1);
|
VALGRIND_MAKE_MEM_DEFINED(&x->mmInfo, 1);
|
||||||
|
VALGRIND_MAKE_MEM_DEFINED(&x->type, 1);
|
||||||
#endif
|
#endif
|
||||||
#ifdef DONT_FREE
|
#ifdef DONT_FREE
|
||||||
if (x->type!=t_freed) x->flags = x->type;
|
if (x->type!=t_freed) x->flags = x->type;
|
||||||
|
|||||||
@ -7,6 +7,7 @@ typedef struct Mut {
|
|||||||
|
|
||||||
void mut_to(Mut* m, u8 n) {
|
void mut_to(Mut* m, u8 n) {
|
||||||
u8 o = m->type;
|
u8 o = m->type;
|
||||||
|
assert(o!=el_B);
|
||||||
m->type = n;
|
m->type = n;
|
||||||
if (o==el_MAX) {
|
if (o==el_MAX) {
|
||||||
switch(n) { default: UD;
|
switch(n) { default: UD;
|
||||||
@ -18,6 +19,9 @@ void mut_to(Mut* m, u8 n) {
|
|||||||
} else {
|
} else {
|
||||||
sprnk(m->val, 1);
|
sprnk(m->val, 1);
|
||||||
m->val->sh = &m->val->ia;
|
m->val->sh = &m->val->ia;
|
||||||
|
#ifdef USE_VALGRIND
|
||||||
|
VALGRIND_MAKE_MEM_DEFINED(m->val, mm_size((Value*)m->val)); // it's incomplete, but it's a typed array so garbage is acceptable
|
||||||
|
#endif
|
||||||
switch(n) { default: UD;
|
switch(n) { default: UD;
|
||||||
case el_i32: m->val = (Arr*)toI32Arr(tag(m->val, ARR_TAG)); return;
|
case el_i32: m->val = (Arr*)toI32Arr(tag(m->val, ARR_TAG)); return;
|
||||||
case el_f64: m->val = (Arr*)toF64Arr(tag(m->val, ARR_TAG)); return;
|
case el_f64: m->val = (Arr*)toF64Arr(tag(m->val, ARR_TAG)); return;
|
||||||
|
|||||||
25
src/stuff.c
25
src/stuff.c
@ -84,12 +84,28 @@ void printRaw(B x) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
B eq_c2(B t, B w, B x);
|
B def_decompose(B x) { return m_v2(m_i32((isFun(x)|isMd(x))? 0 : -1),x); }
|
||||||
|
bool atomEqual(B w, B x) { // doesn't consume (not that that matters really currently)
|
||||||
|
if(isF64(w)&isF64(x)) return w.f==x.f;
|
||||||
|
if (w.u==x.u) return true;
|
||||||
|
if (!isVal(w) | !isVal(x)) return false;
|
||||||
|
if (v(w)->type!=v(x)->type) return false;
|
||||||
|
B2B dcf = TI(w).decompose;
|
||||||
|
if (dcf == def_decompose) return false;
|
||||||
|
B wd=dcf(inc(w)); B* wdp = harr_ptr(wd);
|
||||||
|
B xd=dcf(inc(x)); B* xdp = harr_ptr(xd);
|
||||||
|
if (o2i(wdp[0])<=1) { dec(wd);dec(xd); return false; }
|
||||||
|
usz wia = a(wd)->ia;
|
||||||
|
if (wia!=a(xd)->ia) { dec(wd);dec(xd); return false; }
|
||||||
|
for (i32 i = 0; i<wia; i++) if(!equal(wdp[i], xdp[i]))
|
||||||
|
{ dec(wd);dec(xd); return false; }
|
||||||
|
dec(wd);dec(xd); return true;
|
||||||
|
}
|
||||||
bool equal(B w, B x) { // doesn't consume
|
bool equal(B w, B x) { // doesn't consume
|
||||||
bool wa = isArr(w);
|
bool wa = isAtm(w);
|
||||||
bool xa = isArr(x);
|
bool xa = isAtm(x);
|
||||||
if (wa!=xa) return false;
|
if (wa!=xa) return false;
|
||||||
if (!wa) return o2iu(eq_c2(bi_N, inc(w), inc(x)))?1:0;
|
if (wa) return atomEqual(w, x);
|
||||||
if (!eqShape(w,x)) return false;
|
if (!eqShape(w,x)) return false;
|
||||||
usz ia = a(x)->ia;
|
usz ia = a(x)->ia;
|
||||||
BS2B xgetU = TI(x).getU;
|
BS2B xgetU = TI(x).getU;
|
||||||
@ -176,7 +192,6 @@ B def_m1_d(B m, B f ) { thrM("cannot derive this"); }
|
|||||||
B def_m2_d(B m, B f, B g) { thrM("cannot derive this"); }
|
B def_m2_d(B m, B f, B g) { thrM("cannot derive this"); }
|
||||||
B def_slice(B x, usz s) { thrM("cannot slice non-array!"); }
|
B def_slice(B x, usz s) { thrM("cannot slice non-array!"); }
|
||||||
bool def_canStore(B x) { return false; }
|
bool def_canStore(B x) { return false; }
|
||||||
B def_decompose(B x) { return m_v2(m_i32((isFun(x)|isMd(x))? 0 : -1),x); }
|
|
||||||
|
|
||||||
static inline void hdr_init() {
|
static inline void hdr_init() {
|
||||||
for (i32 i = 0; i < t_COUNT; i++) {
|
for (i32 i = 0; i < t_COUNT; i++) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user