16-bit & 64-bit ⊔ cases
This commit is contained in:
parent
5d687b1ac3
commit
88f4fdaa7e
@ -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);
|
||||
|
||||
@ -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]
|
||||
@ -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); }
|
||||
|
||||
Loading…
Reference in New Issue
Block a user