diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 708edf14..59d6c360 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -513,7 +513,7 @@ B GRADE_CAT(c2)(B t, B w, B x) { } #if SINGELI - u8 k = elWidthLogBits(we) - 3; + u8 k = elwByteLog(we); u8 rl = wia<128 ? 0 : wia<(1<<15) ? 1 : wia<(1<<31) ? 2 : 3; void *rp = m_tyarrc(&r, 1<1) { rsh=m_shArr(co); shcpy(rsh->a,SH(x),co); } B r0 = widenBitArr(x, co); - usz csz = shProd(SH(r0),co,RNK(r0)) << elWidthLogBits(TI(r0,elType)); + usz csz = shProd(SH(r0),co,RNK(r0)) << elwBitLog(TI(r0,elType)); u8 t; if (csz==8) t = t_i8slice; else if (csz==16) t = t_i16slice; @@ -129,8 +129,8 @@ static NOINLINE B2 splitCells(B n, B p, u8 mode) { // 0:∊ 1:⊐ 2:⊒ u8 pe = TI(p,elType); if (nepeb? neb : peb; ux rb = csz<0 → csz*sizeof(B) >= 64 return false; diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c index 1e896e79..2d61590e 100644 --- a/src/builtins/transpose.c +++ b/src/builtins/transpose.c @@ -68,7 +68,7 @@ typedef void (*TranspFn)(void*,void*,u64,u64,u64,u64); static void transpose_move(void* rv, void* xv, u8 xe, usz w, usz h) { assert(xe!=el_bit); assert(xe!=el_B); - transposeFns[elWidthLogBits(xe)-3](rv, xv, w, h, w, h); + transposeFns[elwByteLog(xe)](rv, xv, w, h, w, h); } // Return an array with data from x transposed as though it's shape h,w // Shape of result needs to be set afterwards! @@ -274,7 +274,7 @@ B transp_c2(B t, B w, B x) { j0 -= rsh[a] * str; \ } \ } - u8 xlw = elWidthLogBits(xe); + u8 xlw = elwBitLog(xe); if (csz >= (32*8) >> xlw) { // cell >= 32 bytes usz ria = csz * shProd(rsh, 0, na); MAKE_MUT_INIT(rm, ria, xe); MUTG_INIT(rm); diff --git a/src/core/arrFns.h b/src/core/arrFns.h index da2a6c72..6944210d 100644 --- a/src/core/arrFns.h +++ b/src/core/arrFns.h @@ -53,8 +53,10 @@ extern u8 elType2type[]; #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] -extern u8 elTypeWidthLogBits[]; -#define elWidthLogBits(X) elTypeWidthLogBits[X] +extern u8 elwBitLogT[]; +#define elwBitLog(X) elwBitLogT[X] +extern u8 elwByteLogT[]; +#define elwByteLog(X) elwByteLogT[X] extern u8 arrTypeWidthLog[]; #define arrTypeWidthLog(X) arrTypeWidthLog[X] extern u8 arrTypeBitsLog[]; diff --git a/src/core/tyarr.c b/src/core/tyarr.c index a6747ba3..9121e4c9 100644 --- a/src/core/tyarr.c +++ b/src/core/tyarr.c @@ -12,15 +12,19 @@ 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, - [el_B] = 8 + [el_f64] = 8, [el_B ] = 8, [el_bit] = 0 }; -u8 elTypeWidthLogBits[] = { +u8 elwBitLogT[] = { [el_i8 ] = 3, [el_c8 ] = 3, [el_i16] = 4, [el_c16] = 4, [el_i32] = 5, [el_c32] = 5, - [el_bit] = 0, [el_f64] = 6, - [el_B] = 6 + [el_f64] = 6, [el_B ] = 6, [el_bit] = 0 +}; +u8 elwByteLogT[] = { + [el_i8 ] = 0, [el_c8 ] = 0, + [el_i16] = 1, [el_c16] = 1, + [el_i32] = 2, [el_c32] = 2, + [el_f64] = 3, [el_B ] = 3, [el_bit] = 99 }; u8 arrTypeWidthLog[] = { [t_bitarr]=0, // 0 for mut.c hack to allow restoring a bitarr offset from array pointer & arrTypeWidthLog-"corrected" element pointer diff --git a/src/utils/bits.c b/src/utils/bits.c index c7346fd4..525b8fc8 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -178,7 +178,7 @@ static NOINLINE B zeroPadToCellBits0(B x, usz lr, usz cam, usz pcsz, usz ncsz) { } NOINLINE B widenBitArr(B x, ur axis) { assert(isArr(x) && TI(x,elType)!=el_B && axis>=1 && RNK(x)>=axis); - usz pcsz = shProd(SH(x), axis, RNK(x))<