From c9be8516c365b427587191a8d53cf009dfa81841 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 5 Nov 2022 19:12:10 +0200 Subject: [PATCH] deduplicate generic sort work --- src/builtins/grade.h | 11 +---------- src/builtins/sort.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 7852a3da..2ab47965 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -286,19 +286,10 @@ B GRADE_CAT(c1)(B t, B x) { if (elChr(xe)) { x = taga(cpyC32Arr(x)); goto el32; } SLOW1(GRADE_CHR"𝕩", x); - TALLOC(BI32p, tmp, ia); - SGetU(x) - for (usz i = 0; i < ia; i++) { - tmp[i].v = i; - tmp[i].k = GetU(x,i); - } - CAT(GRADE_CAT(BP),tim_sort)(tmp, ia); - for (usz i = 0; i < ia; i++) rp[i] = tmp[i].v; - TFREE(tmp); + generic_grade(x, ia, r, rp, CAT(GRADE_CAT(BP),tim_sort)); goto decG_sq; decG_sq:; - if (ia<=(I8_MAX+1)) r = taga(cpyI8Arr(r)); else if (ia<=(I16_MAX+1)) r = taga(cpyI16Arr(r)); decG(x); diff --git a/src/builtins/sort.c b/src/builtins/sort.c index 2371dad7..2684600d 100644 --- a/src/builtins/sort.c +++ b/src/builtins/sort.c @@ -8,6 +8,18 @@ typedef struct BI32p { B k; i32 v; } BI32p; typedef struct I32I32p { i32 k; i32 v; } I32I32p; +static NOINLINE void generic_grade(B x, usz ia, B r, i32* rp, void (*fn)(BI32p*, size_t)) { + TALLOC(BI32p, tmp, ia); + SGetU(x) + for (usz i = 0; i < ia; i++) { + tmp[i].v = i; + tmp[i].k = GetU(x,i); + } + fn(tmp, ia); + for (usz i = 0; i < ia; i++) rp[i] = tmp[i].v; + TFREE(tmp); +} + #define GRADE_UD(U,D) U #include "grade.h" #define GRADE_UD(U,D) D