aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcryptobox/cryptobox.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2024-09-16 14:31:24 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2024-09-16 14:31:24 +0100
commitf32ee02772bad947ebaa4818940591a28c079e7c (patch)
treecc82d3fe99cf7dbf3d1eb53b561c9e93cdab8bc9 /src/libcryptobox/cryptobox.c
parent3ca5e9bdce7e7bc0a9f3e218989e8ace5c675c2f (diff)
downloadrspamd-f32ee02772bad947ebaa4818940591a28c079e7c.tar.gz
rspamd-f32ee02772bad947ebaa4818940591a28c079e7c.zip
[Rework] Use __builtin_cpu_supports where possible
Diffstat (limited to 'src/libcryptobox/cryptobox.c')
-rw-r--r--src/libcryptobox/cryptobox.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/libcryptobox/cryptobox.c b/src/libcryptobox/cryptobox.c
index eeeed020c..a976653df 100644
--- a/src/libcryptobox/cryptobox.c
+++ b/src/libcryptobox/cryptobox.c
@@ -86,6 +86,60 @@ rspamd_cryptobox_cpuid(int cpu[4], int info)
#endif
}
+#ifdef HAVE_BUILTIN_CPU_SUPPORTS
+RSPAMD_CONSTRUCTOR(cryptobox_cpu_init)
+{
+ __builtin_cpu_init();
+}
+static gboolean
+rspamd_cryptobox_test_instr(int instr)
+{
+ gboolean ret = FALSE;
+ switch (instr) {
+#if defined HAVE_SSE2 && defined(__x86_64__)
+ case CPUID_SSE2:
+ ret = __builtin_cpu_supports("sse2");
+ break;
+ case CPUID_RDRAND:
+ /* XXX: no check to test for rdrand, but all avx2 cpus are def. capable of rdrand */
+ ret = __builtin_cpu_supports("avx2");
+ break;
+#endif
+#ifdef HAVE_SSE3
+ case CPUID_SSE3:
+ ret = __builtin_cpu_supports("sse3");
+ break;
+#endif
+#ifdef HAVE_SSSE3
+ case CPUID_SSSE3:
+ ret = __builtin_cpu_supports("ssse3");
+ break;
+#endif
+#ifdef HAVE_SSE41
+ case CPUID_SSE41:
+ ret = __builtin_cpu_supports("sse4.1");
+ break;
+#endif
+#if defined HAVE_SSE42 && defined(__x86_64__)
+ case CPUID_SSE42:
+ ret = __builtin_cpu_supports("sse4.2");
+ break;
+#endif
+#ifdef HAVE_AVX
+ case CPUID_AVX:
+ ret = __builtin_cpu_supports("avx");
+ break;
+#endif
+#ifdef HAVE_AVX2
+ case CPUID_AVX2:
+ ret = __builtin_cpu_supports("avx2");
+ break;
+#endif
+ }
+
+ return ret;
+}
+#else
static sig_atomic_t ok = 0;
static jmp_buf j;
@@ -171,6 +225,7 @@ rspamd_cryptobox_test_instr(int instr)
/* We actually never return here if SIGILL has been caught */
return ok == 1;
}
+#endif /* HAVE_BUILTIN_CPU_SUPPORTS */
struct rspamd_cryptobox_library_ctx *
rspamd_cryptobox_init(void)