unified Singeli including mechanism
This commit is contained in:
parent
9768526ddc
commit
09b3279958
@ -22,8 +22,6 @@ B atan2_c2(B, B, B);
|
||||
typedef void (*AndBytesFn)(u8*, u8*, u64, u64);
|
||||
|
||||
#if SINGELI
|
||||
#define BCALL(N, X) N(b(X))
|
||||
#define interp_f64(X) b(X).f
|
||||
#include "../singeli/c/arithdDispatch.c"
|
||||
static AndBytesFn andBytes_fn = avx2_andBytes;
|
||||
#else
|
||||
|
||||
@ -15,10 +15,8 @@
|
||||
#include "../builtins.h"
|
||||
|
||||
#if SINGELI
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/fold.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE fold
|
||||
#include "../utils/includeSingeli.h"
|
||||
#endif
|
||||
|
||||
static bool fold_ne(u64* x, u64 am) {
|
||||
|
||||
@ -10,18 +10,15 @@ static u64 vg_rand(u64 x) { return x; }
|
||||
#endif
|
||||
|
||||
#if SINGELI
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/scan.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE scan
|
||||
#include "../utils/includeSingeli.h"
|
||||
#if __PCLMUL__
|
||||
#define SINGELI_FILE neq
|
||||
#include "../utils/includeSingeli.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SINGELI && __PCLMUL__
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/neq.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
B scan_ne(B x, u64 p, u64 ia) { // consumes x
|
||||
u64* xp = bitarr_ptr(x);
|
||||
u64* rp; B r=m_bitarrv(&rp,ia);
|
||||
|
||||
@ -35,17 +35,8 @@
|
||||
#include "../builtins.h"
|
||||
|
||||
#if SINGELI
|
||||
#include <xmmintrin.h>
|
||||
#if __GNUC__ && !__clang__ // old gcc versions don't define _mm_loadu_si32 & _mm_storeu_si32
|
||||
static __m128i custom_loadu_si32(void* p) { return (__m128i) _mm_load_ss(p); }
|
||||
static void custom_storeu_si32(void* p, __m128i x) { _mm_store_ss(p, _mm_castsi128_ps(x)); }
|
||||
#define _mm_loadu_si32 custom_loadu_si32
|
||||
#define _mm_storeu_si32 custom_storeu_si32
|
||||
#endif
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/select.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE select
|
||||
#include "../utils/includeSingeli.h"
|
||||
#endif
|
||||
|
||||
extern B rt_select;
|
||||
|
||||
@ -150,19 +150,15 @@
|
||||
void storeu_u64(u64* p, u64 v) { memcpy(p, &v, 8); }
|
||||
u64 loadu_u64(u64* p) { u64 v; memcpy(&v, p, 8); return v; }
|
||||
#if SINGELI
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/slash.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE slash
|
||||
#include "../utils/includeSingeli.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SINGELI
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/constrep.c"
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#define SINGELI_FILE constrep
|
||||
#include "../utils/includeSingeli.h"
|
||||
|
||||
extern void (*const avx2_scan_pluswrap_u8)(uint8_t* v0,uint8_t* v1,uint64_t v2,uint8_t v3);
|
||||
extern void (*const avx2_scan_pluswrap_u16)(uint16_t* v0,uint16_t* v1,uint64_t v2,uint16_t v3);
|
||||
extern void (*const avx2_scan_pluswrap_u32)(uint32_t* v0,uint32_t* v1,uint64_t v2,uint32_t v3);
|
||||
|
||||
@ -1,10 +1,8 @@
|
||||
#include "../core.h"
|
||||
|
||||
#if SINGELI
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/squeeze.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE squeeze
|
||||
#include "../utils/includeSingeli.h"
|
||||
#endif
|
||||
|
||||
NOINLINE B num_squeezeF(B x, usz ia) {
|
||||
|
||||
@ -423,10 +423,8 @@ NOINLINE bool atomEqualF(B w, B x) {
|
||||
}
|
||||
|
||||
#if SINGELI
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/equal.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE equal
|
||||
#include "../utils/includeSingeli.h"
|
||||
|
||||
typedef bool (*EqFn)(void* a, void* b, u64 l, u64 data);
|
||||
bool notEq(void* a, void* b, u64 l, u64 data) { return false; }
|
||||
|
||||
@ -313,10 +313,8 @@ B dyArith_SA(DyTableSA* table, B w, B x) {
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../gen/dyarith.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE dyarith
|
||||
#include "../../utils/includeSingeli.h"
|
||||
|
||||
static void rootAAu_f64_f64_f64(void* r, void* w, void* x, u64 len) { for (u64 i = 0; i < len; i++) ((f64*)r)[i] = pow(((f64*)x)[i], 1.0/((f64*)w)[i]); }
|
||||
static void powAAu_f64_f64_f64(void* r, void* w, void* x, u64 len) { for (u64 i = 0; i < len; i++) ((f64*)r)[i] = pow(((f64*)w)[i], ((f64*)x)[i]); }
|
||||
|
||||
@ -6,12 +6,8 @@ extern bool please_tail_call_err;
|
||||
static NOINLINE void cmp_err() { if (please_tail_call_err) thrM("Invalid comparison"); }
|
||||
|
||||
|
||||
#define BCALL(N, X) N(b(X))
|
||||
#define interp_f64(X) b(X).f
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../gen/cmp.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE cmp
|
||||
#include "../../utils/includeSingeli.h"
|
||||
|
||||
FN_LUT_A(cmp_fns, eq, AS); FN_LUT_A(cmp_fns, eq, AA);
|
||||
FN_LUT_A(cmp_fns, ne, AS); FN_LUT_A(cmp_fns, ne, AA);
|
||||
|
||||
@ -2,10 +2,8 @@
|
||||
|
||||
|
||||
#if SINGELI
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/bits.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE bits
|
||||
#include "../utils/includeSingeli.h"
|
||||
#define bitselFns avx2_bitsel
|
||||
#endif
|
||||
|
||||
|
||||
25
src/utils/includeSingeli.h
Normal file
25
src/utils/includeSingeli.h
Normal file
@ -0,0 +1,25 @@
|
||||
#if !defined(SI_C_DEFS)
|
||||
#define SI_C_DEFS
|
||||
|
||||
#if __GNUC__ && !__clang__ && (defined(__x86_64) || defined(__amd64__)) // old gcc versions don't define _mm_loadu_si32 & _mm_storeu_si32
|
||||
#include <xmmintrin.h>
|
||||
static __m128i custom_loadu_si32(void* p) { return (__m128i) _mm_load_ss(p); }
|
||||
static void custom_storeu_si32(void* p, __m128i x) { _mm_store_ss(p, _mm_castsi128_ps(x)); }
|
||||
#define _mm_loadu_si32 custom_loadu_si32
|
||||
#define _mm_storeu_si32 custom_storeu_si32
|
||||
#endif
|
||||
|
||||
#define BCALL(N, X) N(b(X))
|
||||
#define interp_f64(X) b(X).f
|
||||
|
||||
#define SINGELI_FILE0(X) #X
|
||||
#define SINGELI_FILE1(X) SINGELI_FILE0(X)
|
||||
#endif
|
||||
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include SINGELI_FILE1(../singeli/gen/SINGELI_FILE.c)
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#undef SINGELI_FILE
|
||||
@ -218,18 +218,8 @@ DEF_G(void, copy, B, (void* a, usz ms, B x, usz xs, usz l), ms, x, x
|
||||
}
|
||||
|
||||
#if SINGELI
|
||||
#include <xmmintrin.h>
|
||||
#if __GNUC__ && !__clang__ // old gcc versions don't define _mm_loadu_si32 & _mm_storeu_si32
|
||||
static __m128i custom_loadu_si32(void* p) { return (__m128i) _mm_load_ss(p); }
|
||||
static void custom_storeu_si32(void* p, __m128i x) { _mm_store_ss(p, _mm_castsi128_ps(x)); }
|
||||
#define _mm_loadu_si32 custom_loadu_si32
|
||||
#define _mm_storeu_si32 custom_storeu_si32
|
||||
#endif
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
#include "../singeli/gen/copy.c"
|
||||
#pragma GCC diagnostic pop
|
||||
#define SINGELI_FILE copy
|
||||
#include "./includeSingeli.h"
|
||||
typedef void (*copy_fn)(void*, void*, u64, void*);
|
||||
|
||||
static void badCopy(void* xp, void* rp, u64 len, void* xRaw) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user