unified Singeli including mechanism

This commit is contained in:
dzaima 2022-12-18 01:51:06 +02:00
parent 9768526ddc
commit 09b3279958
12 changed files with 53 additions and 70 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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) {

View File

@ -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; }

View File

@ -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]); }

View File

@ -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);

View File

@ -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

View 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

View 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) {