From 02087d76117bd6a58c15ef6f884636f64a1c41f1 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 2 Apr 2022 20:05:03 +0300 Subject: [PATCH] split non-tail-calling part of equal to its own function --- src/core/stuff.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/core/stuff.c b/src/core/stuff.c index 21bdc3c1..216573a5 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -437,13 +437,23 @@ NOINLINE bool atomEqualR(B w, B x) { }; #endif +NOINLINE bool equalSlow(B w, B x, usz ia); NOINLINE bool equal(B w, B x) { // doesn't consume bool wa = isAtm(w); bool xa = isAtm(x); if (wa!=xa) return false; if (wa) return atomEqual(w, x); - if (!eqShape(w,x)) return false; + ur wr = rnk(w); + ur xr = rnk(x); + if (wr!=xr) return false; usz ia = a(x)->ia; + if (LIKELY(wr==1)) { + if (ia != a(w)->ia) return false; + } else { + usz* wsh = a(w)->sh; + usz* xsh = a(x)->sh; + if (wsh!=xsh) for (usz i = 0; i < wr; i++) if (wsh[i]!=xsh[i]) return false; + } if (ia==0) return true; u8 we = TI(w,elType); u8 xe = TI(x,elType); @@ -473,6 +483,9 @@ NOINLINE bool equal(B w, B x) { // doesn't consume return true; } #endif + return equalSlow(w, x, ia); +} +bool equalSlow(B w, B x, usz ia) { SLOW2("equal", w, x); SGetU(x) SGetU(w)