projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added 99.95 and 99.99 default percentiles.
[fio.git]
/
crc
/
crc32c-intel.c
diff --git
a/crc/crc32c-intel.c
b/crc/crc32c-intel.c
index 5040efeae9030005af296bfa72c07414535144a4..8a6e6dcefb749b41ed5ecddb7035ae6a8c247adf 100644
(file)
--- a/
crc/crc32c-intel.c
+++ b/
crc/crc32c-intel.c
@@
-18,6
+18,8
@@
* Volume 2A: Instruction Set Reference, A-M
*/
* Volume 2A: Instruction Set Reference, A-M
*/
+int crc32c_intel_available = 0;
+
#ifdef ARCH_HAVE_SSE4_2
#if BITS_PER_LONG == 64
#ifdef ARCH_HAVE_SSE4_2
#if BITS_PER_LONG == 64
@@
-28,6
+30,8
@@
#define SCALE_F 4
#endif
#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)
{
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");
}
: "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 */
}
#endif /* ARCH_HAVE_SSE */