From a39264533ebe1f790bfd9690665a71d8daf5d2f0 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 12 May 2023 16:25:31 +0300 Subject: [PATCH] custom _mm_loadu_si16/_mm_storeu_si16 for old gcc --- src/utils/includeSingeli.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/includeSingeli.h b/src/utils/includeSingeli.h index 06b388b3..c97af53e 100644 --- a/src/utils/includeSingeli.h +++ b/src/utils/includeSingeli.h @@ -1,11 +1,15 @@ #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 + #if EXACTLY_GCC && (defined(__x86_64) || defined(__amd64__)) // old gcc versions don't define some smaller-size loads/stores #include static __m128i custom_loadu_si32(void* p) { return (__m128i) _mm_load_ss(p); } + static __m128i custom_loadu_si16(void* p) { return _mm_insert_epi16(_mm_setzero_si128(), *(i16*)p, 0); } static void custom_storeu_si32(void* p, __m128i x) { _mm_store_ss(p, _mm_castsi128_ps(x)); } + static void custom_storeu_si16(void* p, __m128i x) { *(i16*)p = _mm_extract_epi16(x, 0); } + #define _mm_loadu_si16 custom_loadu_si16 #define _mm_loadu_si32 custom_loadu_si32 + #define _mm_storeu_si16 custom_storeu_si16 #define _mm_storeu_si32 custom_storeu_si32 #endif