| /* | |
| * Copyright (c) 2021, 2023, Intel Corporation. All rights reserved. | |
| * Copyright (c) 2021 Serge Sans Paille. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| * | |
| */ | |
| // This implementation is based on x86-simd-sort(https://github.com/intel/x86-simd-sort) | |
| #ifndef XSS_COMMON_INCLUDES | |
| #define XSS_COMMON_INCLUDES | |
| #include <algorithm> | |
| #include <cmath> | |
| #include <cstdint> | |
| #include <cstring> | |
| /* | |
| Workaround for the bug in GCC12 (that was fixed in GCC 12.3.1). | |
| More details are available at: | |
| https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 | |
| */ | |
| #pragma GCC diagnostic push | |
| #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" | |
| #pragma GCC diagnostic ignored "-Wuninitialized" | |
| #include <immintrin.h> | |
| #pragma GCC diagnostic pop | |
| #include <limits> | |
| #include <vector> | |
| #define X86_SIMD_SORT_INFINITY std::numeric_limits<double>::infinity() | |
| #define X86_SIMD_SORT_INFINITYF std::numeric_limits<float>::infinity() | |
| #define X86_SIMD_SORT_INFINITYH 0x7c00 | |
| #define X86_SIMD_SORT_NEGINFINITYH 0xfc00 | |
| #define X86_SIMD_SORT_MAX_UINT16 std::numeric_limits<uint16_t>::max() | |
| #define X86_SIMD_SORT_MAX_INT16 std::numeric_limits<int16_t>::max() | |
| #define X86_SIMD_SORT_MIN_INT16 std::numeric_limits<int16_t>::min() | |
| #define X86_SIMD_SORT_MAX_UINT32 std::numeric_limits<uint32_t>::max() | |
| #define X86_SIMD_SORT_MAX_INT32 std::numeric_limits<int32_t>::max() | |
| #define X86_SIMD_SORT_MIN_INT32 std::numeric_limits<int32_t>::min() | |
| #define X86_SIMD_SORT_MAX_UINT64 std::numeric_limits<uint64_t>::max() | |
| #define X86_SIMD_SORT_MAX_INT64 std::numeric_limits<int64_t>::max() | |
| #define X86_SIMD_SORT_MIN_INT64 std::numeric_limits<int64_t>::min() | |
| #define ZMM_MAX_DOUBLE _mm512_set1_pd(X86_SIMD_SORT_INFINITY) | |
| #define ZMM_MAX_UINT64 _mm512_set1_epi64(X86_SIMD_SORT_MAX_UINT64) | |
| #define ZMM_MAX_INT64 _mm512_set1_epi64(X86_SIMD_SORT_MAX_INT64) | |
| #define ZMM_MAX_FLOAT _mm512_set1_ps(X86_SIMD_SORT_INFINITYF) | |
| #define ZMM_MAX_UINT _mm512_set1_epi32(X86_SIMD_SORT_MAX_UINT32) | |
| #define ZMM_MAX_INT _mm512_set1_epi32(X86_SIMD_SORT_MAX_INT32) | |
| #define ZMM_MAX_HALF _mm512_set1_epi16(X86_SIMD_SORT_INFINITYH) | |
| #define YMM_MAX_HALF _mm256_set1_epi16(X86_SIMD_SORT_INFINITYH) | |
| #define ZMM_MAX_UINT16 _mm512_set1_epi16(X86_SIMD_SORT_MAX_UINT16) | |
| #define ZMM_MAX_INT16 _mm512_set1_epi16(X86_SIMD_SORT_MAX_INT16) | |
| #define SHUFFLE_MASK(a, b, c, d) (a << 6) | (b << 4) | (c << 2) | d | |
| #define PRAGMA(x) _Pragma(#x) | |
| #define UNUSED(x) (void)(x) | |
| /* Compiler specific macros specific */ | |
| #if defined(__GNUC__) | |
| #define X86_SIMD_SORT_INLINE static inline | |
| #define X86_SIMD_SORT_FINLINE static inline __attribute__((always_inline)) | |
| #else | |
| #define X86_SIMD_SORT_INLINE static | |
| #define X86_SIMD_SORT_FINLINE static | |
| #endif | |
| #if __GNUC__ >= 8 | |
| #define X86_SIMD_SORT_UNROLL_LOOP(num) PRAGMA(GCC unroll num) | |
| #else | |
| #define X86_SIMD_SORT_UNROLL_LOOP(num) | |
| #endif | |
| typedef size_t arrsize_t; | |
| template <typename type> | |
| struct zmm_vector; | |
| template <typename type> | |
| struct ymm_vector; | |
| template <typename type> | |
| struct avx2_vector; | |
| #endif // XSS_COMMON_INCLUDES |