#include "../core.h" #include "../utils/each.h" #define P2(N) { if (isArr(w)|isArr(x)) { \ SLOWIF((!isArr(w) || TI(w,elType)!=el_B) && (!isArr(x) || TI(x,elType)!=el_B)) SLOW2("cmp " #N, w, x); \ return arith_recd(N##_c2, w, x); \ }} #if SINGELI #include "../singeli/c/cmp.c" #else #define AL(X) u64* rp; B r = m_bitarrc(&rp, X); usz ria=a(r)->ia; usz bia = BIT_N(ria); #define CMP_IMPL(CHR, NAME, RNAME, PNAME, L, R, OP, FC, CF, BX) \ 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) { B tw=w,tx=x; \ we = aMakeEq(&tw, &tx, we, xe); \ if (we==el_MAX) goto end; \ w=tw; x=tx; \ } \ AL(x) \ switch(we) { default: UD; \ case el_bit: { u64* wp=bitarr_ptr(w); u64* xp=bitarr_ptr(x); for(usz i=0;ixe?we:xe; if (elNum(we) & elNum(xe)) { switch(me) { default: UD; case el_i8: s = taga(cpyI8Arr (s)); break; case el_i16: s = taga(cpyI16Arr(s)); break; case el_i32: s = taga(cpyI32Arr(s)); break; case el_f64: s = taga(cpyF64Arr(s)); break; } } else if (elChr(we) & elChr(xe)) { switch(me) { default: UD; case el_c16: s = taga(cpyC16Arr(s)); break; case el_c32: s = taga(cpyC32Arr(s)); break; } } else return el_MAX; *(we=, 0, 1, wv | ~xv) CMP("<", lt,gt, gt, x,w, < , 1, 0, ~wv & xv) CMP(">", gt,lt, gt, w,x, > , 0, 1, wv & ~xv) #undef CMP B eq_c2(B t, B w, B x) { CMP_IMPL("=", eq, eq, eq, w,x, ==, 0, 0, ~wv^xv); 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("≠", ne, ne, ne, w,x, !=, 1, 1, wv^xv); 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); }