From 88f4fdaa7e3df3154768af6d7f759a8a6d73df05 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 1 May 2022 03:14:23 +0300 Subject: [PATCH] =?UTF-8?q?16-bit=20&=2064-bit=20=E2=8A=94=20cases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/sfns.c | 56 ++++++++++++++++++++++++--------------------- src/core/arrFns.h | 4 +++- src/core/tyarr.c | 9 ++++++-- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index fa6dbc55..bf54d0ef 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -977,34 +977,38 @@ B group_c2(B t, B w, B x) { Arr* rf = m_fillarrp(0); fillarr_setFill(rf, m_f64(0)); arr_shVec(rf); fillarr_setFill(r, taga(rf)); u8 xe = TI(x,elType); - if (xe==el_i8 || xe==el_c8) { - for (usz i = 0; i < ria; i++) m_tyarrv(rp+i, 1, len[i], el2t(xe)); - u8* xp = tyany_ptr(x); - for (usz i = 0; i < xia; i++) { - i32 n = wp[i]; - if (n>=0) ((u8*)tyarr_ptr(rp[n]))[pos[n]++] = xp[i]; + switch (xe) { default: UD; + case el_i8: case el_c8: + 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); + + switch(width) { default: UD; + case 1: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=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; + case 4: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u32*)tyarr_ptr(rp[n]))[pos[n]++] = ((u32*)xp)[i]; } break; + case 8: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((f64*)tyarr_ptr(rp[n]))[pos[n]++] = ((f64*)xp)[i]; } break; + } + break; } - } else if (xe==el_i32 || xe==el_c32) { - for (usz i = 0; i < ria; i++) m_tyarrv(rp+i, 4, len[i], el2t(xe)); - u32* xp = tyany_ptr(x); - for (usz i = 0; i < xia; i++) { - i32 n = wp[i]; - if (n>=0) ((u32*)tyarr_ptr(rp[n]))[pos[n]++] = xp[i]; + case el_bit: case el_B: { + for (usz i = 0; i < ria; i++) { + Arr* c = m_fillarrp(len[i]); + fillarr_setFill(c, inc(xf)); + c->ia = 0; + rp[i] = taga(c); + } + SLOW2("𝕨⊔𝕩", w, x); + SGet(x) + for (usz i = 0; i < xia; i++) { + i32 n = wp[i]; + if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = Get(x, i); + } + for (usz i = 0; i < ria; i++) { a(rp[i])->ia = len[i]; arr_shVec(a(rp[i])); } + break; } - } else { - for (usz i = 0; i < ria; i++) { - Arr* c = m_fillarrp(len[i]); - fillarr_setFill(c, inc(xf)); - c->ia = 0; - rp[i] = taga(c); - } - SLOW2("𝕨⊔𝕩", w, x); - SGet(x) - for (usz i = 0; i < xia; i++) { - i32 n = wp[i]; - if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = Get(x, i); - } - for (usz i = 0; i < ria; i++) { a(rp[i])->ia = len[i]; arr_shVec(a(rp[i])); } } fillarr_setFill(rf, xf); decG(w); decG(x); TFREE(lenO); TFREE(pos); diff --git a/src/core/arrFns.h b/src/core/arrFns.h index 5c9e3513..811b4445 100644 --- a/src/core/arrFns.h +++ b/src/core/arrFns.h @@ -35,4 +35,6 @@ static void* m_tyarrc (B* rp, usz w, B x, u8 type ) M_TYARR( , a static void* m_tyarrcO(B* rp, usz w, B x, u8 type, usz over) M_TYARR(+over, arr_shCopy((Arr*)r,x);, taga(r), usz ia = a(x)->ia;) extern u8 elType2type[]; -#define el2t(X) elType2type[X] // TODO maybe reorganize array types such that this can just be addition? \ No newline at end of file +#define el2t(X) elType2type[X] // TODO maybe reorganize array types such that this can just be addition? +extern u8 elTypeWidth[]; +#define elWidth(X) elTypeWidth[X] \ No newline at end of file diff --git a/src/core/tyarr.c b/src/core/tyarr.c index 4d66842f..43a83955 100644 --- a/src/core/tyarr.c +++ b/src/core/tyarr.c @@ -2,11 +2,16 @@ #include "../utils/mut.h" u8 elType2type[] = { - [el_bit] = t_bitarr, [el_i8 ] = t_i8arr, [el_c8 ] = t_c8arr, [el_i16] = t_i16arr,[el_c16] = t_c16arr, [el_i32] = t_i32arr,[el_c32] = t_c32arr, - [el_f64] = t_f64arr + [el_bit] = t_bitarr,[el_f64] = t_f64arr +}; +u8 elTypeWidth[] = { + [el_i8 ] = 1, [el_c8 ] = 1, + [el_i16] = 2, [el_c16] = 2, + [el_i32] = 4, [el_c32] = 4, + [el_bit] = 0, [el_f64] = 8 }; B m_i8(i8 x) { return m_i32(x); } B m_i16(i16 x) { return m_i32(x); }