fast leading-axis for <>≤≥=≠

This commit is contained in:
dzaima 2023-04-30 19:00:56 +03:00
parent c889a07d75
commit 93dd25e0e1

View File

@ -133,21 +133,29 @@ CMP_REC(ne, ne, swapped=0;)
B leading_axis_arith(FC2 fc2, B w, B x, usz* wsh, usz* xsh, ur mr);
#define AL(X) u64* rp; B r = m_bitarrc(&rp, X); usz ria=IA(r)
#define CMP_AA_D(CN, CR, NAME, PRE) NOINLINE B NAME##_AA(i32 swapped, B w, B x) { PRE \
u8 xe = TI(x, elType); if (xe==el_B) goto bad; \
u8 we = TI(w, elType); if (we==el_B) goto bad; \
if (RNK(w)==RNK(x)) { if (!eqShape(w, x)) thrF("%U: Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", swapped?CR:CN, swapped?x:w, swapped?w:x); \
if (we!=xe) { B tw=w,tx=x; \
we = aMakeEq(&tw, &tx, we, xe); \
if (we==el_MAX) goto bad; \
w=tw; x=tx; \
} \
AL(x); \
if (ria) cmp_fns_##NAME##AA[we](rp, tyany_ptr(w), tyany_ptr(x), ria); \
decG(w);decG(x); return r; \
u8 xe = TI(x,elType); if (xe==el_B) goto base; \
u8 we = TI(w,elType); if (we==el_B) goto base; \
ur wr=RNK(w); usz* wsh=SH(w); \
ur xr=RNK(x); usz* xsh=SH(x); \
if (wr!=xr) { \
ur mr = wr<xr? wr : xr; \
if (!eqShPart(wsh, xsh, mr)) goto badShape; \
return leading_axis_arith(NAME##_c2, w, x, wsh, xsh, mr); \
} \
if (!eqShPart(wsh, xsh, wr)) goto badShape; \
if (we!=xe) { B tw=w,tx=x; \
we = aMakeEq(&tw, &tx, we, xe); \
if (we==el_MAX) goto base; \
w=tw; x=tx; \
} \
bad: return NAME##_rec(swapped, w, x); \
AL(x); \
if (ria) cmp_fns_##NAME##AA[we](rp, tyany_ptr(w), tyany_ptr(x), ria); \
decG(w);decG(x); return r; \
base: return NAME##_rec(swapped,w,x); \
badShape: thrF("%U: Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", swapped?CR:CN, swapped?x:w, swapped?w:x); \
}
CMP_AA_D("", "", ge, )
CMP_AA_D(">", "<", gt, )