extract bitsel to a function table
This commit is contained in:
parent
2b323817ca
commit
b99d5f23d5
@ -1,11 +1,20 @@
|
|||||||
#include "../core.h"
|
#include "../core.h"
|
||||||
|
#include "../utils/calls.h"
|
||||||
#include "mut.h"
|
#include "mut.h"
|
||||||
|
|
||||||
|
|
||||||
#if SINGELI_SIMD
|
#if SINGELI_SIMD
|
||||||
#define SINGELI_FILE bits
|
#define SINGELI_FILE bits
|
||||||
#include "../utils/includeSingeli.h"
|
#include "../utils/includeSingeli.h"
|
||||||
#define bitselFns simd_bitsel
|
INIT_GLOBAL BitSelFn* bitselFns = simd_bitsel;
|
||||||
|
#else
|
||||||
|
#define BITSEL_DEF(E) void bitsel_##E(void* rp, u64* bp, u64 e0i, u64 e1i, u64 ia) { for (usz i=0; i<ia; i++) ((E*)rp)[i] = bitp_get(bp,i)? e1i : e0i; }
|
||||||
|
BITSEL_DEF(u8)
|
||||||
|
BITSEL_DEF(u16)
|
||||||
|
BITSEL_DEF(u32)
|
||||||
|
BITSEL_DEF(u64)
|
||||||
|
INIT_GLOBAL BitSelFn bitselFnsRaw[] = {bitsel_u8, bitsel_u16, bitsel_u32, bitsel_u64};
|
||||||
|
INIT_GLOBAL BitSelFn* bitselFns = bitselFnsRaw;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__BMI2__) && !SLOW_PDEP
|
#if defined(__BMI2__) && !SLOW_PDEP
|
||||||
@ -53,16 +62,7 @@ NOINLINE B bit_sel(B b, B e0, B e1) {
|
|||||||
|
|
||||||
sel:;
|
sel:;
|
||||||
void* rp = m_tyarrlc(&r, width, b, type);
|
void* rp = m_tyarrlc(&r, width, b, type);
|
||||||
#if SINGELI_SIMD
|
|
||||||
bitselFns[width](rp, bp, e0i, e1i, ia);
|
bitselFns[width](rp, bp, e0i, e1i, ia);
|
||||||
#else
|
|
||||||
switch(width) {
|
|
||||||
case 0: for (usz i=0; i<ia; i++) (( u8*)rp)[i] = bitp_get(bp,i)? e1i : e0i; break;
|
|
||||||
case 1: for (usz i=0; i<ia; i++) ((u16*)rp)[i] = bitp_get(bp,i)? e1i : e0i; break;
|
|
||||||
case 2: for (usz i=0; i<ia; i++) ((u32*)rp)[i] = bitp_get(bp,i)? e1i : e0i; break;
|
|
||||||
case 3: for (usz i=0; i<ia; i++) ((u64*)rp)[i] = bitp_get(bp,i)? e1i : e0i; break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
goto dec_ret;
|
goto dec_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -36,3 +36,6 @@ typedef struct { EqFn fn; u8 data; } EqFnObj;
|
|||||||
|
|
||||||
typedef bool (*RangeFn)(void* xp, i64* res, u64 len); // writes min,max in res, assumes len≥1; returns 0 and leaves res undefined if either any (floor(x)≠x or abs>2⋆53), or (x≠(i64)x)
|
typedef bool (*RangeFn)(void* xp, i64* res, u64 len); // writes min,max in res, assumes len≥1; returns 0 and leaves res undefined if either any (floor(x)≠x or abs>2⋆53), or (x≠(i64)x)
|
||||||
extern INIT_GLOBAL RangeFn getRange_fns[el_f64+1]; // limited to ≤el_f64
|
extern INIT_GLOBAL RangeFn getRange_fns[el_f64+1]; // limited to ≤el_f64
|
||||||
|
|
||||||
|
typedef void (*BitSelFn)(void*,u64*,u64,u64,u64);
|
||||||
|
extern INIT_GLOBAL BitSelFn* bitselFns;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user