X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=crc%2Fcrc32c-intel.c;h=6e810a28f93608dfafcaac4bb6dec03bea526554;hp=5040efeae9030005af296bfa72c07414535144a4;hb=2401022342f650ac7d845a14c7b9bf1cd87cead6;hpb=cc62ea704e4de10eb595b551f29af41266cf225d diff --git a/crc/crc32c-intel.c b/crc/crc32c-intel.c index 5040efea..6e810a28 100644 --- a/crc/crc32c-intel.c +++ b/crc/crc32c-intel.c @@ -1,10 +1,3 @@ -#include -#include -#include -#include -#include -#include -#include #include "crc32c.h" /* @@ -18,6 +11,8 @@ * Volume 2A: Instruction Set Reference, A-M */ +bool crc32c_intel_available = false; + #ifdef ARCH_HAVE_SSE4_2 #if BITS_PER_LONG == 64 @@ -28,6 +23,8 @@ #define SCALE_F 4 #endif +static bool crc32c_probed; + static uint32_t crc32c_intel_le_hw_byte(uint32_t crc, unsigned char const *data, unsigned long length) { @@ -74,30 +71,17 @@ uint32_t crc32c_intel(unsigned char const *data, unsigned long length) return crc; } -static void do_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, - unsigned int *edx) +void crc32c_intel_probe(void) { - int id = *eax; + if (!crc32c_probed) { + unsigned int eax, ebx, ecx = 0, edx; - asm("movl %4, %%eax;" - "cpuid;" - "movl %%eax, %0;" - "movl %%ebx, %1;" - "movl %%ecx, %2;" - "movl %%edx, %3;" - : "=r" (*eax), "=r" (*ebx), "=r" (*ecx), "=r" (*edx) - : "r" (id) - : "eax", "ebx", "ecx", "edx"); -} + eax = 1; -int crc32c_intel_works(void) -{ - unsigned int eax, ebx, ecx, edx; - - eax = 1; - - do_cpuid(&eax, &ebx, &ecx, &edx); - return (ecx & (1 << 20)) != 0; + do_cpuid(&eax, &ebx, &ecx, &edx); + crc32c_intel_available = (ecx & (1 << 20)) != 0; + crc32c_probed = true; + } } -#endif /* ARCH_HAVE_SSE */ +#endif /* ARCH_HAVE_SSE4_2 */