diff --git a/src/builtins/arithm.c b/src/builtins/arithm.c index 42733dce..1d2bcaad 100644 --- a/src/builtins/arithm.c +++ b/src/builtins/arithm.c @@ -25,8 +25,6 @@ B lt_c1(B t, B x) { return m_unit(x); } B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); decR(x); return r; } B ne_c1(B t, B x) { B r = m_f64(isArr(x)&&rnk(x)? *a(x)->sh : 1); decR(x); return r; } -extern B rt_sortDsc; -B or_c1(B t, B x) { return c1(rt_sortDsc, x); } void arith_init() { c(BFn,bi_add)->ident = c(BFn,bi_sub)->ident = c(BFn,bi_or )->ident = c(BFn,bi_ne)->ident = c(BFn,bi_gt)->ident = m_i32(0); diff --git a/src/builtins/sort.c b/src/builtins/sort.c index 5c382bd1..c9d52005 100644 --- a/src/builtins/sort.c +++ b/src/builtins/sort.c @@ -17,17 +17,15 @@ typedef struct I32I32p { i32 k; i32 v; } I32I32p; #include "grade.h" #define SORT_CMP(W, X) compare(W, X) -#define SORT_NAME b +#define SORT_NAME bA #define SORT_TYPE B #include "sortTemplate.h" #define SORT_CMP(W, X) ((W) - (i64)(X)) -#define SORT_NAME i +#define SORT_NAME iA #define SORT_TYPE i32 #include "sortTemplate.h" - - B and_c1(B t, B x) { if (isAtm(x) || rnk(x)==0) thrM("∧: Argument cannot have rank 0"); if (rnk(x)!=1) return bqn_merge(and_c1(t, toCells(x))); @@ -36,7 +34,7 @@ B and_c1(B t, B x) { i32* xp = i32any_ptr(x); i32* rp; B r = m_i32arrv(&rp, xia); memcpy(rp, xp, xia*4); - i_tim_sort(rp, xia); + iA_tim_sort(rp, xia); dec(x); return r; } @@ -44,7 +42,39 @@ B and_c1(B t, B x) { HArr_p r = m_harrUv(xia); BS2B xget = TI(x).get; for (usz i = 0; i < xia; i++) r.a[i] = xget(x,i); - b_tim_sort(r.a, xia); + bA_tim_sort(r.a, xia); + dec(x); + return withFill(r.b,xf); +} + + +#define SORT_CMP(W, X) compare(X, W) +#define SORT_NAME bD +#define SORT_TYPE B +#include "sortTemplate.h" + +#define SORT_CMP(W, X) ((X) - (i64)(W)) +#define SORT_NAME iD +#define SORT_TYPE i32 +#include "sortTemplate.h" + +B or_c1(B t, B x) { + if (isAtm(x) || rnk(x)==0) thrM("∨: Argument cannot have rank 0"); + if (rnk(x)!=1) return bqn_merge(or_c1(t, toCells(x))); + usz xia = a(x)->ia; + if (TI(x).elType==el_i32) { + i32* xp = i32any_ptr(x); + i32* rp; B r = m_i32arrv(&rp, xia); + memcpy(rp, xp, xia*4); + iD_tim_sort(rp, xia); + dec(x); + return r; + } + B xf = getFillQ(x); + HArr_p r = m_harrUv(xia); + BS2B xget = TI(x).get; + for (usz i = 0; i < xia; i++) r.a[i] = xget(x,i); + bD_tim_sort(r.a, xia); dec(x); return withFill(r.b,xf); } diff --git a/src/load.c b/src/load.c index c436dbb8..6a652ab3 100644 --- a/src/load.c +++ b/src/load.c @@ -26,8 +26,8 @@ B rtWrap_wrap(B x); // consumes _Thread_local B comp_currPath; _Thread_local B comp_currArgs; -B rt_sortDsc, rt_merge, rt_undo, rt_select, rt_slash, rt_join, rt_ud, rt_pick,rt_take, - rt_drop, rt_group, rt_under, rt_reverse, rt_indexOf, rt_count, rt_memberOf, rt_find, rt_cell; +B rt_merge, rt_undo, rt_select, rt_slash, rt_join, rt_ud, rt_pick,rt_take, rt_drop, + rt_group, rt_under, rt_reverse, rt_indexOf, rt_count, rt_memberOf, rt_find, rt_cell; Block* load_compObj(B x, B src, Scope* sc) { // consumes x,src BS2B xget = TI(x).get; usz xia = a(x)->ia; @@ -170,8 +170,6 @@ static inline void load_init() { // very last init function HArr_p runtimeH = m_harrUc(rtObjRaw); BS2B rtObjGet = TI(rtObjRaw).get; - rt_sortDsc = rtObjGet(rtObjRaw, 11); gc_add(rt_sortDsc); - rt_merge = rtObjGet(rtObjRaw, 13); gc_add(rt_merge); rt_undo = rtObjGet(rtObjRaw, 48); gc_add(rt_undo); rt_select = rtObjGet(rtObjRaw, 35); gc_add(rt_select); rt_slash = rtObjGet(rtObjRaw, 32); gc_add(rt_slash);