diff --git a/src/singeli/src/bits.singeli b/src/singeli/src/bits.singeli index c054d492..9f9c34e3 100644 --- a/src/singeli/src/bits.singeli +++ b/src/singeli/src/bits.singeli @@ -24,7 +24,6 @@ bitsel_i{VL,T}(r:*void, bits:*u64, e0:u64, e1:u64, len:u64) : void = { bitsel{VL, T, *T~~r, bits, trunc{T,e0}, trunc{T,e1}, len} } -'avx2_bitsel_8' =bitsel_i{256, u8} -'avx2_bitsel_16'=bitsel_i{256, u16} -'avx2_bitsel_32'=bitsel_i{256, u32} -'avx2_bitsel_64'=bitsel_i{256, u64} \ No newline at end of file +def table{w} = each{{T} => bitsel_i{w, T}, tup{u8, u16, u32, u64}} + +def tup_bitsel = table{256}; v_bitsel:*type{tupsel{0,tup_bitsel}} = tup_bitsel; 'avx2_bitsel'=v_bitsel \ No newline at end of file diff --git a/src/utils/bits.c b/src/utils/bits.c index b1f356bc..c57473d3 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -6,13 +6,7 @@ #pragma GCC diagnostic ignored "-Wunused-variable" #include "../singeli/gen/bits.c" #pragma GCC diagnostic pop - typedef void (*BitselFn)(void*, u64*, u64, u64, u64); - static BitselFn bitselFns[] = { - [0]=avx2_bitsel_8, - [1]=avx2_bitsel_16, - [2]=avx2_bitsel_32, - [3]=avx2_bitsel_64, - }; + #define bitselFns avx2_bitsel #endif NOINLINE Arr* allZeroes(usz ia) { u64* rp; Arr* r = m_bitarrp(&rp, ia); for (usz i = 0; i < BIT_N(ia); i++) rp[i] = 0; return r; }