diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2023-07-11 21:39:10 +0100 |
---|---|---|
committer | Richard Henderson <richard.henderson@linaro.org> | 2023-09-15 13:57:00 +0000 |
commit | d6493dbb46b4b7be13a39425b5a1e523e72f5a68 (patch) | |
tree | db479fc17d939ada4560d3e9509fd53878d7b84f /host | |
parent | 7bdbf233d9636a4bc73a2513b5e1a83a388626cf (diff) | |
download | qemu-d6493dbb46b4b7be13a39425b5a1e523e72f5a68.zip qemu-d6493dbb46b4b7be13a39425b5a1e523e72f5a68.tar.gz qemu-d6493dbb46b4b7be13a39425b5a1e523e72f5a68.tar.bz2 |
host/include/i386: Implement clmul.h
Detect PCLMUL in cpuinfo; implement the accel hook.
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'host')
-rw-r--r-- | host/include/i386/host/cpuinfo.h | 1 | ||||
-rw-r--r-- | host/include/i386/host/crypto/clmul.h | 29 | ||||
-rw-r--r-- | host/include/x86_64/host/crypto/clmul.h | 1 |
3 files changed, 31 insertions, 0 deletions
diff --git a/host/include/i386/host/cpuinfo.h b/host/include/i386/host/cpuinfo.h index 073d0a4..7ae2156 100644 --- a/host/include/i386/host/cpuinfo.h +++ b/host/include/i386/host/cpuinfo.h @@ -27,6 +27,7 @@ #define CPUINFO_ATOMIC_VMOVDQA (1u << 16) #define CPUINFO_ATOMIC_VMOVDQU (1u << 17) #define CPUINFO_AES (1u << 18) +#define CPUINFO_PCLMUL (1u << 19) /* Initialized with a constructor. */ extern unsigned cpuinfo; diff --git a/host/include/i386/host/crypto/clmul.h b/host/include/i386/host/crypto/clmul.h new file mode 100644 index 0000000..dc3c814 --- /dev/null +++ b/host/include/i386/host/crypto/clmul.h @@ -0,0 +1,29 @@ +/* + * x86 specific clmul acceleration. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef X86_HOST_CRYPTO_CLMUL_H +#define X86_HOST_CRYPTO_CLMUL_H + +#include "host/cpuinfo.h" +#include <immintrin.h> + +#if defined(__PCLMUL__) +# define HAVE_CLMUL_ACCEL true +# define ATTR_CLMUL_ACCEL +#else +# define HAVE_CLMUL_ACCEL likely(cpuinfo & CPUINFO_PCLMUL) +# define ATTR_CLMUL_ACCEL __attribute__((target("pclmul"))) +#endif + +static inline Int128 ATTR_CLMUL_ACCEL +clmul_64_accel(uint64_t n, uint64_t m) +{ + union { __m128i v; Int128 s; } u; + + u.v = _mm_clmulepi64_si128(_mm_set_epi64x(0, n), _mm_set_epi64x(0, m), 0); + return u.s; +} + +#endif /* X86_HOST_CRYPTO_CLMUL_H */ diff --git a/host/include/x86_64/host/crypto/clmul.h b/host/include/x86_64/host/crypto/clmul.h new file mode 100644 index 0000000..f25eced --- /dev/null +++ b/host/include/x86_64/host/crypto/clmul.h @@ -0,0 +1 @@ +#include "host/include/i386/host/crypto/clmul.h" |