|
@@ -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 */
|