X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=crc%2Fcrc32c-intel.c;h=8a6e6dcefb749b41ed5ecddb7035ae6a8c247adf;hb=dd366728eb503e6344215ae6ec153c7ab6eafd9b;hp=5040efeae9030005af296bfa72c07414535144a4;hpb=cc62ea704e4de10eb595b551f29af41266cf225d;p=fio.git diff --git a/crc/crc32c-intel.c b/crc/crc32c-intel.c index 5040efea..8a6e6dce 100644 --- a/crc/crc32c-intel.c +++ b/crc/crc32c-intel.c @@ -18,6 +18,8 @@ * Volume 2A: Instruction Set Reference, A-M */ +int crc32c_intel_available = 0; + #ifdef ARCH_HAVE_SSE4_2 #if BITS_PER_LONG == 64 @@ -28,6 +30,8 @@ #define SCALE_F 4 #endif +static int crc32c_probed; + static uint32_t crc32c_intel_le_hw_byte(uint32_t crc, unsigned char const *data, unsigned long length) { @@ -90,14 +94,17 @@ static void do_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, : "eax", "ebx", "ecx", "edx"); } -int crc32c_intel_works(void) +void crc32c_intel_probe(void) { - unsigned int eax, ebx, ecx, edx; + if (!crc32c_probed) { + unsigned int eax, ebx, ecx, edx; - eax = 1; + 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 = 1; + } } #endif /* ARCH_HAVE_SSE */