From 54abc94cad8c17c8fb7cd33a6a7d5f39eb7406e6 Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 10 May 2021 23:22:00 +0300 Subject: [PATCH] =?UTF-8?q?=E2=80=A2=5Ftimed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fillarr.c | 2 +- src/h.h | 4 ++-- src/md1.c | 20 ++++++++++++++++++-- src/sysfn.c | 2 ++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/fillarr.c b/src/fillarr.c index 85db79a7..88d2ddb4 100644 --- a/src/fillarr.c +++ b/src/fillarr.c @@ -275,7 +275,7 @@ B withFill(B x, B fill) { // consumes both dec(x); return r; } - base: + base:; B r = m_arr(fsizeof(FillArr,a,B,ia), t_fillarr); arr_shCopy(r, x); c(FillArr,r)->fill = fill; diff --git a/src/h.h b/src/h.h index 17643772..f754c7ac 100644 --- a/src/h.h +++ b/src/h.h @@ -126,12 +126,12 @@ char* format_pf(u8 u) { } enum PrimMd1 { pm1_none, - pm1_tbl, pm1_each, pm1_fold, pm1_scan, pm1_const, pm1_swap, // md1.c + pm1_tbl, pm1_each, pm1_fold, pm1_scan, pm1_const, pm1_swap, pm1_timed, // md1.c }; char* format_pm1(u8 u) { switch(u) { default: case pf_none: return"(unknown 1-modifier)"; - case pm1_tbl:return"⌜"; case pm1_each:return"¨"; case pm1_fold:return"´"; case pm1_scan:return"`"; case pm1_const:return"˙"; case pm1_swap:return"˜"; + case pm1_tbl:return"⌜"; case pm1_each:return"¨"; case pm1_fold:return"´"; case pm1_scan:return"`"; case pm1_const:return"˙"; case pm1_swap:return"˜"; case pm1_timed:return"•_timed"; } } enum PrimMd2 { diff --git a/src/md1.c b/src/md1.c index f0918f14..e91e61d1 100644 --- a/src/md1.c +++ b/src/md1.c @@ -188,14 +188,30 @@ B swap_c1(B d , B x) { return c2(c(Md1D,d)->f, inc(x), x); } B swap_c2(B d, B w, B x) { return c2(c(Md1D,d)->f, x , w); } +B timed_c2(B d, B w, B x) { B f = c(Md1D,d)->f; + i64 am = o2i64(w); + for (i64 i = 0; i < am; i++) inc(x); + dec(x); + u64 sns = nsTime(); + for (i64 i = 0; i < am; i++) dec(c1(f, x)); + u64 ens = nsTime(); + return m_f64((ens-sns)/(1e9*am)); +} +B timed_c1(B d, B x) { B f = c(Md1D,d)->f; + u64 sns = nsTime(); + dec(c1(f, x)); + u64 ens = nsTime(); + return m_f64((ens-sns)/1e9); +} + #define ba(NAME) bi_##NAME = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,bi_##NAME)->c2 = NAME##_c2; c(Md1,bi_##NAME)->c1 = NAME##_c1 ; c(Md1,bi_##NAME)->extra=pm1_##NAME; gc_add(bi_##NAME); #define bd(NAME) bi_##NAME = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,bi_##NAME)->c2 = NAME##_c2; c(Md1,bi_##NAME)->c1 = c1_invalid; c(Md1,bi_##NAME)->extra=pm1_##NAME; gc_add(bi_##NAME); #define bm(NAME) bi_##NAME = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,bi_##NAME)->c2 = c2_invalid;c(Md1,bi_##NAME)->c1 = NAME##_c1 ; c(Md1,bi_##NAME)->extra=pm1_##NAME; gc_add(bi_##NAME); void print_md1BI(B x) { printf("%s", format_pm1(c(Md1,x)->extra)); } -B bi_tbl, bi_each, bi_fold, bi_scan, bi_const, bi_swap; -static inline void md1_init() { ba(tbl) ba(each) ba(fold) ba(scan) ba(const) ba(swap) +B bi_tbl, bi_each, bi_fold, bi_scan, bi_const, bi_swap, bi_timed; +static inline void md1_init() { ba(tbl) ba(each) ba(fold) ba(scan) ba(const) ba(swap) ba(timed) ti[t_md1BI].print = print_md1BI; } diff --git a/src/sysfn.c b/src/sysfn.c index 6b5dc7cd..327e3740 100644 --- a/src/sysfn.c +++ b/src/sysfn.c @@ -168,6 +168,7 @@ BI_FNS0(F); static inline void sysfn_init() { BI_FNS1(F) } #undef F +B bi_timed; B sys_c1(B t, B x) { assert(isArr(x)); usz i = 0; @@ -183,6 +184,7 @@ B sys_c1(B t, B x) { else if (eqStr(c, U"primind")) r.a[i] = inc(bi_primInd); else if (eqStr(c, U"bqn")) r.a[i] = inc(bi_bqn); else if (eqStr(c, U"cmp")) r.a[i] = inc(bi_cmp); + else if (eqStr(c, U"timed")) r.a[i] = inc(bi_timed); else { dec(x); thrM("Unknown system function"); } } return harr_fcd(r, x);