/
githubmirror
/
galahad
Обзор
Документация
Войти
/
githubmirror
/
galahad
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/java.base/linux/native/libsimdsort/xss-common-includes.h
101 строка
4 KB
vamsi-parasa
8319577: x86_64 AVX2 intrinsics for Arrays.sort methods (int, float arrays)
09 дек 2023, 01:52
09 дек 2023, 01:52
ce10844
Код
Авторство
О чём код?
/* * 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