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) {
|
||||
if(isF64(w)&isF64(x)) return m_i32(w.f==x.f);
|
||||
P2(eq);
|
||||
if (w.u==x.u) { dec(w);dec(x); return m_i32(1); }
|
||||
// doesn't handle int=float
|
||||
if (!isVal(w) | !isVal(x)) { dec(w);dec(x); return m_i32(0); }
|
||||
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 r = m_i32(atomEqual(w, x));
|
||||
dec(w); dec(x);
|
||||
return r;
|
||||
}
|
||||
B ne_c2(B t, B w, B x) {
|
||||
if(isF64(w)&isF64(x)) return m_i32(w.f!=x.f);
|
||||
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,12 +141,12 @@ void validateFill(B x) {
|
||||
}
|
||||
|
||||
B fill_or(B wf, B xf) { // consumes
|
||||
if (!equal(wf, xf)) {
|
||||
dec(wf); dec(xf);
|
||||
return bi_noFill;
|
||||
if (wf.u==xf.u || equal(wf, xf)) {
|
||||
dec(wf);
|
||||
return xf;
|
||||
}
|
||||
dec(wf);
|
||||
return xf;
|
||||
dec(wf); dec(xf);
|
||||
return bi_noFill;
|
||||
}
|
||||
|
||||
B fill_both(B w, B x) { // doesn't consume
|
||||
|
||||
16
src/h.h
16
src/h.h
@ -210,13 +210,14 @@ B inc(B x);
|
||||
void ptr_dec(void* x);
|
||||
void ptr_inc(void* x);
|
||||
void printUTF8(u32 c);
|
||||
void printRaw(B x); // doesn't consume
|
||||
void print(B x); // doesn't consume
|
||||
bool equal(B w, B x); // doesn't consume
|
||||
void arr_print(B x); // doesn't consume
|
||||
u8 fillElType(B x); // doesn't consume
|
||||
bool eqShape(B w, B x); // doesn't consume
|
||||
usz arr_csz(B x); // doesn't consume
|
||||
void printRaw(B x); // doesn't consume
|
||||
void print(B x); // doesn't consume
|
||||
bool equal(B w, B x); // doesn't consume
|
||||
void arr_print(B x); // doesn't consume
|
||||
u8 fillElType(B x); // doesn't consume
|
||||
bool eqShape(B w, 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);
|
||||
|
||||
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_print(B x) { arr_print(x); }
|
||||
|
||||
B* harr_ptr(B x);
|
||||
|
||||
|
||||
typedef void (*B2v)(B);
|
||||
|
||||
@ -59,6 +59,7 @@ void BN(free)(Value* x) {
|
||||
#ifdef USE_VALGRIND
|
||||
VALGRIND_MAKE_MEM_UNDEFINED(x, BSZ(x->mmInfo&63));
|
||||
VALGRIND_MAKE_MEM_DEFINED(&x->mmInfo, 1);
|
||||
VALGRIND_MAKE_MEM_DEFINED(&x->type, 1);
|
||||
#endif
|
||||
#ifdef DONT_FREE
|
||||
if (x->type!=t_freed) x->flags = x->type;
|
||||
|
||||
@ -7,6 +7,7 @@ typedef struct Mut {
|
||||
|
||||
void mut_to(Mut* m, u8 n) {
|
||||
u8 o = m->type;
|
||||
assert(o!=el_B);
|
||||
m->type = n;
|
||||
if (o==el_MAX) {
|
||||
switch(n) { default: UD;
|
||||
@ -18,6 +19,9 @@ void mut_to(Mut* m, u8 n) {
|
||||
} else {
|
||||
sprnk(m->val, 1);
|
||||
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;
|
||||
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;
|
||||
|
||||
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 wa = isArr(w);
|
||||
bool xa = isArr(x);
|
||||
bool wa = isAtm(w);
|
||||
bool xa = isAtm(x);
|
||||
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;
|
||||
usz ia = a(x)->ia;
|
||||
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_slice(B x, usz s) { thrM("cannot slice non-array!"); }
|
||||
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() {
|
||||
for (i32 i = 0; i < t_COUNT; i++) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user