1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
/* Copyright (C) 2024 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
// Checked with clang 5 (2017) and gcc 6 (2016).
// For other cases we'll rather keep just the generic implementation.
#if defined(__x86_64__) && (__clang_major__ >= 5 || __GNUC__ >= 6)
// This file has code for new-ish x86 (2015+ usually, Atom 2021+) - AES + AVX2
#if __clang_major__ >= 12
#pragma clang attribute push (__attribute__((target("arch=x86-64-v3,aes"))), \
apply_to = function)
#elif __clang__
#pragma clang attribute push (__attribute__((target("avx2,aes"))), \
apply_to = function)
#else
#pragma GCC push_options
#if __GNUC__ >= 11
#pragma GCC target("arch=x86-64-v3,aes")
// try harder for auto-vectorization, etc.
#pragma GCC optimize("O3")
#else
#pragma GCC target("avx2,aes")
#endif
#endif
#define USE_AES 1
#define USE_AVX2 1
#define USE_SSE41 1
#include "lib/defines.h"
#include "./kru.inc.c" // NOLINT(bugprone-suspicious-include)
KR_EXPORT
const struct kru_api KRU_AVX2 = KRU_API_INITIALIZER;
#ifdef __clang__
#pragma clang attribute pop
#else
#pragma GCC pop_options
#endif
__attribute__((constructor))
static void detect_CPU_avx2(void)
{
// Checking just AES+AVX2 will most likely be OK even if we used arch=x86-64-v3
if (__builtin_cpu_supports("aes") && __builtin_cpu_supports("avx2")) {
KRU = KRU_AVX2;
}
}
#else
#include "./kru.h"
#include "lib/defines.h"
KR_EXPORT
const struct kru_api KRU_AVX2 = {NULL};
#endif
|