#include "../core.h" #include "../utils/each.h" #include #define P2(N) { if(isArr(w)|isArr(x)) return arith_recd(N##_c2, w, x); } #define AL(X) i8* rp; B r = m_i8arrc(&rp, X); #define CMP_IMPL(CHR,OP,FC,CF) \ if (isF64(w)&isF64(x)) return m_i32(w.f OP x.f); \ if (isC32(w)&isC32(x)) return m_i32(w.u OP x.u); \ if (isF64(w)&isC32(x)) return m_i32(FC); \ if (isC32(w)&isF64(x)) return m_i32(CF); \ if (isArr(w)) { u8 we = TI(w,elType); \ if (we==el_B) goto end; \ if (isArr(x)) { u8 xe = TI(x,elType); \ if (xe==el_B) goto end; \ if (rnk(w)==rnk(x)) { if (!eqShape(w, x)) thrF(CHR": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \ if (we==xe) { AL(x) usz ria=a(r)->ia; \ switch(we) { default: UD; \ case el_i8 : { i8* wp=i8any_ptr (w); i8* xp=i8any_ptr (x); for(usz i=0;iia; \ switch(we) { default: UD; \ case el_i8: { if (!q_i8 (x)) break; i8 xv=o2iu(x); i8* wp=i8any_ptr (w); for(usz i=0;iia; \ switch(xe) { default: UD; \ case el_i8: { if (!q_i8 (w)) break; i8 wv=o2iu(w); i8* xp=i8any_ptr (x); for(usz i=0;i=, 0, 1) CMP("<", lt, < , 1, 0) CMP(">", gt, > , 0, 1) #undef CMP B eq_c2(B t, B w, B x) { CMP_IMPL("=", ==, 0, 0); P2(eq); B r = m_i32(atomEqual(w, x)); dec(w); dec(x); return r; } B ne_c2(B t, B w, B x) { CMP_IMPL("≠", !=, 1, 1); P2(ne); B r = m_i32(!atomEqual(w, x)); dec(w); dec(x); return r; } extern B rt_merge; B gt_c1(B t, B x) { if (isAtm(x)) return x; return bqn_merge(x); }