bring back atomEqualF fast path
This commit is contained in:
parent
61e5ca2767
commit
503bddced5
@ -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);
|
||||
|
||||
1
src/h.h
1
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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
1
src/ns.c
1
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;
|
||||
}
|
||||
|
||||
10
src/vm.c
10
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;
|
||||
|
||||
@ -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}¨ =‿≠‿<‿>‿≤‿≥
|
||||
|
||||
Loading…
Reference in New Issue
Block a user