From 503bddced54997aab1b1ec1ef4c6b40f308cfe6f Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 10 Oct 2024 03:59:02 +0300 Subject: [PATCH] bring back atomEqualF fast path --- src/builtins/compare.c | 4 ++-- src/h.h | 1 + src/load.c | 2 ++ src/nfns.c | 1 + src/ns.c | 1 + src/vm.c | 10 +++++++--- test/cases/prims.bqn | 3 +++ 7 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/builtins/compare.c b/src/builtins/compare.c index 458482d5..7e4cd237 100644 --- a/src/builtins/compare.c +++ b/src/builtins/compare.c @@ -54,7 +54,7 @@ NOINLINE i32 compareF(B w, B x) { } NOINLINE bool atomEqualF(B w, B x) { - if (TY(w)!=TY(x)) return false; + if (TY(w)!=TY(x) || TI(w,byRef)) return false; B2B dcf = TI(w,decompose); B wd=dcf(incG(w)); B* wdp = harr_ptr(wd); B xd=dcf(incG(x)); B* xdp = harr_ptr(xd); @@ -72,7 +72,7 @@ bool atomEEqual(B w, B x) { // doesn't consume if (isF64(w)&isF64(x)) return w.f==x.f; #endif if (!isVal(w) | !isVal(x)) return false; - if (TY(w)!=TY(x)) return false; + if (TY(w)!=TY(x) || TI(w,byRef)) return false; B2B dcf = TI(w,decompose); B wd=dcf(incG(w)); B* wdp = harr_ptr(wd); B xd=dcf(incG(x)); B* xdp = harr_ptr(xd); diff --git a/src/h.h b/src/h.h index 01eea32d..75f265f8 100644 --- a/src/h.h +++ b/src/h.h @@ -580,6 +580,7 @@ typedef B (*D2C2)(Md2D*, B, B); F(B2B, decompose) /* consumes; must return a HArr */ \ F(bool, isArr) /* whether this type would have an ARR_TAG tag, in cases where the tag is unknown */ \ F(bool, arrD1) /* is always an array with depth 1 */ \ + F(bool, byRef) /* is always compared by reference */ \ #define F(TY,N) extern GLOBAL TY ti_##N[t_COUNT]; FOR_TI(F) diff --git a/src/load.c b/src/load.c index 9ad12e37..06731e41 100644 --- a/src/load.c +++ b/src/load.c @@ -828,6 +828,7 @@ void base_init() { // very first init function TIi(i,fn_is) = def_fn_is; TIi(i,fn_iw) = def_fn_iw; TIi(i,m1_iw) = def_m1_iw; TIi(i,m2_iw) = def_m2_iw; TIi(i,fn_ix) = def_fn_ix; TIi(i,m1_ix) = def_m1_ix; TIi(i,m2_ix) = def_m2_ix; + TIi(i,byRef) = false; } TIi(t_empty,freeO) = empty_free; TIi(t_invalid,freeO) = empty_free; TIi(t_freed,freeO) = def_freeO; TIi(t_empty,freeF) = empty_free; TIi(t_invalid,freeF) = empty_free; TIi(t_freed,freeF) = def_freeF; @@ -844,6 +845,7 @@ void base_init() { // very first init function TIi(t_md1BI,visit) = TIi(t_md2BI,visit) = noop_visit; TIi(t_md1BI,freeO) = TIi(t_md2BI,freeO) = TIi(t_funBI,freeO) = builtin_free; TIi(t_md1BI,freeF) = TIi(t_md2BI,freeF) = TIi(t_funBI,freeF) = builtin_free; + TIi(t_md1BI,byRef) = TIi(t_md2BI,byRef) = TIi(t_funBI,byRef) = true; TIi(t_funBI,visit) = funBI_visit; TIi(t_funBI,decompose) = funBI_decompose; TIi(t_md1BI,decompose) = md1BI_decompose; diff --git a/src/nfns.c b/src/nfns.c index de50421d..018dc204 100644 --- a/src/nfns.c +++ b/src/nfns.c @@ -42,5 +42,6 @@ void nfn_init(void) { TIi(t_nfn,visit) = nfn_visit; TIi(t_nfnDesc,visit) = nfnDesc_visit; TIi(t_nfn,print) = nfn_print; TIi(t_nfnDesc,print) = nfnDesc_print; TIi(t_nfn,decompose) = block_decompose; + TIi(t_nfn,byRef) = true; gc_add_ref(&nfn_list); } diff --git a/src/ns.c b/src/ns.c index c7127054..795b381d 100644 --- a/src/ns.c +++ b/src/ns.c @@ -234,4 +234,5 @@ void ns_init(void) { TIi(t_ns,freeF) = ns_freeF; TIi(t_ns,visit) = ns_visit; TIi(t_nsDesc,visit) = noop_visit; TIi(t_ns,print) = ns_print; TIi(t_nsDesc,print) = nsDesc_print; + TIi(t_ns,byRef) = true; } diff --git a/src/vm.c b/src/vm.c index fbf02d62..a4123306 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1271,9 +1271,13 @@ void comp_init(void) { TIi(t_fldAlias,freeO) = alias_freeO; TIi(t_fldAlias,freeF) = alias_freeF; TIi(t_fldAlias,visit) = alias_visit; TIi(t_fldAlias,print) = alias_print; TIi(t_vfyObj ,freeO) = wrobj_freeO; TIi(t_vfyObj ,freeF) = wrobj_freeF; TIi(t_vfyObj ,visit) = wrobj_visit; TIi(t_vfyObj ,print) = vfymO_print; TIi(t_arrMerge,freeO) = wrobj_freeO; TIi(t_arrMerge,freeF) = wrobj_freeF; TIi(t_arrMerge,visit) = wrobj_visit; TIi(t_arrMerge,print) = marrO_print; - TIi(t_funBl ,freeO) = funBl_freeO; TIi(t_funBl ,freeF) = funBl_freeF; TIi(t_funBl ,visit) = funBl_visit; TIi(t_funBl ,print) = funBl_print; TIi(t_funBl,decompose) = block_decompose; - TIi(t_md1Bl ,freeO) = md1Bl_freeO; TIi(t_md1Bl ,freeF) = md1Bl_freeF; TIi(t_md1Bl ,visit) = md1Bl_visit; TIi(t_md1Bl ,print) = md1Bl_print; TIi(t_md1Bl,decompose) = block_decompose; TIi(t_md1Bl,m1_d)=md1Bl_d; - TIi(t_md2Bl ,freeO) = md2Bl_freeO; TIi(t_md2Bl ,freeF) = md2Bl_freeF; TIi(t_md2Bl ,visit) = md2Bl_visit; TIi(t_md2Bl ,print) = md2Bl_print; TIi(t_md2Bl,decompose) = block_decompose; TIi(t_md2Bl,m2_d)=md2Bl_d; + TIi(t_funBl ,freeO) = funBl_freeO; TIi(t_funBl ,freeF) = funBl_freeF; TIi(t_funBl ,visit) = funBl_visit; TIi(t_funBl ,print) = funBl_print; + TIi(t_md1Bl ,freeO) = md1Bl_freeO; TIi(t_md1Bl ,freeF) = md1Bl_freeF; TIi(t_md1Bl ,visit) = md1Bl_visit; TIi(t_md1Bl ,print) = md1Bl_print; + TIi(t_md2Bl ,freeO) = md2Bl_freeO; TIi(t_md2Bl ,freeF) = md2Bl_freeF; TIi(t_md2Bl ,visit) = md2Bl_visit; TIi(t_md2Bl ,print) = md2Bl_print; + + TIi(t_funBl,decompose) = block_decompose; TIi(t_funBl,byRef) = true; + TIi(t_md1Bl,decompose) = block_decompose; TIi(t_md1Bl,byRef) = true; TIi(t_md1Bl,m1_d)=md1Bl_d; + TIi(t_md2Bl,decompose) = block_decompose; TIi(t_md2Bl,byRef) = true; TIi(t_md2Bl,m2_d)=md2Bl_d; TIi(t_funBl,fn_uc1) = funBl_uc1; TIi(t_funBl,fn_im) = funBl_im; TIi(t_md1Bl,m1_im) = md1Bl_im; TIi(t_md2Bl,m2_im) = md2Bl_im; diff --git a/test/cases/prims.bqn b/test/cases/prims.bqn index 11dbd964..93eb2003 100644 --- a/test/cases/prims.bqn +++ b/test/cases/prims.bqn @@ -23,6 +23,9 @@ {•Type}=⟨•Type,•BQN"•Type"⟩ %% 1‿1 {•FChars}=⟨•FChars,•BQN"•FChars"⟩ %% 1‿0 =⌜˜ ⟨+, ⁼, ⌾, {𝕩}, {𝔽𝕩}, {𝔽𝔾}, •internal.PureKeep, •internal.Keep, •Type, •FChars, •_timed, •_while_, 2⊸+, +-, {⇐}⟩ %% 15‿15⥊1∾15⥊0 +≡⌜˜ ⟨(0÷0)⊸+, (0÷0)⊸+⟩ %% [1‿0, 0‿1] +=⌜˜ ⟨(0÷0)⊸+, (0÷0)⊸+⟩ %% [1‿0, 0‿1] +! {𝕩 ≡ ⍷2/𝕩} ⟨(0÷0)⊸+, (0÷0)⊸+⟩ # comparison w←1‿1⥊1 ⋄ x←1‿2⥊1 ⋄ {! (∾⟨•Repr𝕩,": Expected equal shape prefix (1‿1 ≡ ≢𝕨, 1‿2 ≡ ≢𝕩)"⟩) ≡ w 𝕏⎊(•CurrentError∘@) x}¨ =‿≠‿<‿>‿≤‿≥