16-bit & 64-bit ⊔ cases

This commit is contained in:
dzaima 2022-05-01 03:14:23 +03:00
parent 5d687b1ac3
commit 88f4fdaa7e
3 changed files with 40 additions and 29 deletions

View File

@ -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);

View File

@ -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?
#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]

View File

@ -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); }