From ef2dee9a4dcc45cd57153160a7811657dcf9012d Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Fri, 9 Sep 2022 13:21:08 -0400 Subject: [PATCH] =?UTF-8?q?Special=20case=20data=20movement=20for=20?= =?UTF-8?q?=E2=8A=94=20on=20sorted=20=F0=9D=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/sfns.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 417eab4f..43d946ea 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -1303,16 +1303,18 @@ B group_c2(B t, B w, B x) { if (elInt(we)) { if (we==el_bit) w = taga(cpyI8Arr(w)); i64 ria = 0; - bool bad = false; + bool bad = false, sort = true; usz neg = 0; void *wp0 = tyany_ptr(w); #define CASE(T) case el_##T: { \ - T max = -1; \ + T max = -1, prev = -1; \ for (usz i = 0; i < xia; i++) { \ T n = ((T*)wp0)[i]; \ if (n>max) max = n; \ bad |= n < -1; \ neg += n == -1; \ + sort &= prev <= n; \ + prev = n; \ } \ if (wia>xia) { ria=((T*)wp0)[xia]; bad|=ria<-1; } \ i64 m=(i64)max+1; if (m>ria) ria=m; \ @@ -1326,6 +1328,7 @@ B group_c2(B t, B w, B x) { B m = ne_c2(m_f64(0), m_f64(-1), inc(w)); w = slash_c2(m_f64(0), inc(m), w); x = slash_c2(m_f64(0), m, x); xia = IA(x); + neg = 0; } if (TI(w,elType)!=el_i32) w = taga(cpyI32Arr(w)); i32* wp = i32any_ptr(w); @@ -1347,9 +1350,25 @@ B group_c2(B t, B w, B x) { case el_i16: case el_c16: case el_i32: case el_c32: case el_f64: { u8 width = elWidth(xe); - for (usz i = 0; i < ria; i++) m_tyarrv(rp+i, width, len[i], el2t(xe)); void* xp = tyany_ptr(x); + B z = taga(rf); + u8 xt = el2t(xe); + if (sort) { + for (usz j=0, i=neg*width; j=0) ((u8* )tyarr_ptr(rp[n]))[pos[n]++] = ((u8* )xp)[i]; } break; case 2: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u16*)tyarr_ptr(rp[n]))[pos[n]++] = ((u16*)xp)[i]; } break;