diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index 81cc50b2..029a3224 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -20,6 +20,7 @@ B atan2_c2(B, B, B); typedef void (*AndBytesFn)(u8*, u8*, u64, u64); +B leading_axis_arith(FC2 fc2, B w, B x, usz* wsh, usz* xsh, ur mr); #if SINGELI_SIMD #include "../singeli/c/arithdDispatch.c" @@ -181,7 +182,7 @@ static B modint_AS(B w, B xv) { return modint_AA(w, C2(shape, C1(fne, incG(w)) [el_i16] = 0x0001000100010001ULL, [el_i32] = 0x0000000100000001ULL, }; - GC2f("|", stile, pfmod(x.f, w.f), NOUNROLL, + GC2f("|", stile, pfmod(x.f, w.f), NOUNROLL, /*INT_SA*/ if (q_i32(w)) { i32 wi32 = o2iG(w); @@ -276,8 +277,13 @@ static B modint_AS(B w, B xv) { return modint_AA(w, C2(shape, C1(fne, incG(w)) } #define AR_I_AA(CHR, NAME, EXPR, BIT, EXTRA) NOINLINE B NAME##_AA(B t, B w, B x) { \ - if (RNK(w)!=RNK(x)) goto bad; \ - if (!eqShPart(SH(w), SH(x), RNK(w))) thrF(CHR ": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \ + ur wr=RNK(w); usz* xsh=SH(x); \ + ur xr=RNK(x); usz* wsh=SH(w); ur mr=wrmr?mr:wk) != (xk>mr?mr:xk) || !eqShPart(wsh, xsh, mr)) goto generic; + return c2(f, w, x); + } } generic:; M_APD_SH(r, zk, zsh); - S_KSLICES(w, wsh, wk, xkM? cam0 : cam, 1) usz wp = 0; - S_KSLICES(x, xsh, xk, xkM? cam : cam0, 1) usz xp = 0; + S_KSLICES(w, wsh, wk, xkM? cam0 : cam, 1) usz wp=0; + S_KSLICES(x, xsh, xk, xkM? cam : cam0, 1) usz xp=0; FC2 fc2 = c2fn(f); if (ext==1) { for (usz i=0; imainFn, w, x, wsh, xsh, mr); + } + if (!eqShPart(SH(w), SH(x), wr)) goto rec; B r, t; usz ia = IA(w);