From 09b3279958b6e2f46fc87d4481bbc092f2a04884 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 18 Dec 2022 01:51:06 +0200 Subject: [PATCH] unified Singeli including mechanism --- src/builtins/arithd.c | 2 -- src/builtins/fold.c | 6 ++---- src/builtins/scan.c | 17 +++++++---------- src/builtins/select.c | 13 ++----------- src/builtins/slash.c | 14 +++++--------- src/builtins/squeeze.c | 6 ++---- src/core/stuff.c | 6 ++---- src/singeli/c/arithdDispatch.c | 6 ++---- src/singeli/c/cmp.c | 8 ++------ src/utils/bits.c | 6 ++---- src/utils/includeSingeli.h | 25 +++++++++++++++++++++++++ src/utils/mut.c | 14 ++------------ 12 files changed, 53 insertions(+), 70 deletions(-) create mode 100644 src/utils/includeSingeli.h diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index fcd23e93..0a1ce8da 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -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 diff --git a/src/builtins/fold.c b/src/builtins/fold.c index bc4a0e99..912c7e5f 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -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) { diff --git a/src/builtins/scan.c b/src/builtins/scan.c index af61f243..2099c2c2 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -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); diff --git a/src/builtins/select.c b/src/builtins/select.c index 5aa251a4..d6188ee9 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -35,17 +35,8 @@ #include "../builtins.h" #if SINGELI - #include - #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; diff --git a/src/builtins/slash.c b/src/builtins/slash.c index 7772dcc7..f9d05239 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -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); diff --git a/src/builtins/squeeze.c b/src/builtins/squeeze.c index 8ef3cf04..8c90dbe3 100644 --- a/src/builtins/squeeze.c +++ b/src/builtins/squeeze.c @@ -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) { diff --git a/src/core/stuff.c b/src/core/stuff.c index e7028bac..b2433588 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -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; } diff --git a/src/singeli/c/arithdDispatch.c b/src/singeli/c/arithdDispatch.c index c6e5bde2..579ae776 100644 --- a/src/singeli/c/arithdDispatch.c +++ b/src/singeli/c/arithdDispatch.c @@ -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]); } diff --git a/src/singeli/c/cmp.c b/src/singeli/c/cmp.c index 731085cf..7300ada8 100644 --- a/src/singeli/c/cmp.c +++ b/src/singeli/c/cmp.c @@ -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); diff --git a/src/utils/bits.c b/src/utils/bits.c index c57473d3..e6a08fb6 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -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 diff --git a/src/utils/includeSingeli.h b/src/utils/includeSingeli.h new file mode 100644 index 00000000..c5d7d1a6 --- /dev/null +++ b/src/utils/includeSingeli.h @@ -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 + 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 \ No newline at end of file diff --git a/src/utils/mut.c b/src/utils/mut.c index 158017c4..4600170d 100644 --- a/src/utils/mut.c +++ b/src/utils/mut.c @@ -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 - #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) {