Chromium Code Reviews| Index: third_party/zlib/x86.c |
| diff --git a/third_party/zlib/x86.c b/third_party/zlib/x86.c |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..11998667854ccd30a3bc96737d740d4087d753cb |
| --- /dev/null |
| +++ b/third_party/zlib/x86.c |
| @@ -0,0 +1,97 @@ |
| +/* |
| + * x86 feature check |
| + * |
| + * Copyright (C) 2013 Intel Corporation. All rights reserved. |
| + * Author: |
| + * Jim Kukunas |
| + * |
| + * For conditions of distribution and use, see copyright notice in zlib.h |
| + */ |
| + |
| +#include "x86.h" |
| + |
| +int x86_cpu_enable_simd; |
| + |
| +#ifndef _MSC_VER |
| +#include <pthread.h> |
| + |
| +pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT; |
| +static void _x86_check_features(void); |
| + |
| +void x86_check_features(void) |
| +{ |
| + pthread_once(&cpu_check_inited_once, _x86_check_features); |
| +} |
| + |
| +static void _x86_check_features(void) |
| +{ |
| + int x86_cpu_has_sse2; |
| + int x86_cpu_has_sse42; |
| + int x86_cpu_has_pclmulqdq; |
| + unsigned eax, ebx, ecx, edx; |
| + |
| + eax = 1; |
| +#ifdef __i386__ |
| + __asm__ __volatile__ ( |
| + "xchg %%ebx, %1\n\t" |
| + "cpuid\n\t" |
| + "xchg %1, %%ebx\n\t" |
| + : "+a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx) |
| + ); |
| +#else |
| + __asm__ __volatile__ ( |
| + "cpuid\n\t" |
| + : "+a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) |
| + ); |
| +#endif /* (__i386__) */ |
| + |
| + x86_cpu_has_sse2 = edx & 0x4000000; |
| + x86_cpu_has_sse42 = ecx & 0x100000; |
| + x86_cpu_has_pclmulqdq = ecx & 0x2; |
| + |
| + x86_cpu_enable_simd = x86_cpu_has_sse2 && |
| + x86_cpu_has_sse42 && |
| + x86_cpu_has_pclmulqdq; |
| +} |
| +#else |
| +#include <intrin.h> |
| +#include <windows.h> |
| + |
| +static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, PVOID param, PVOID *context); |
| +static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT; |
| + |
| +void x86_check_features(void) |
| +{ |
| +#if (_WIN32_WINNT >= 0x0600) |
|
agl
2014/10/30 01:25:43
I assume that this #if check was supposed to catch
robert.bradford
2014/10/30 14:31:50
It checked the presence in the header file, as we
|
| + typedef BOOL (WINAPI *INIT_ONCE_FUNC)(PINIT_ONCE, PINIT_ONCE_FN, PVOID, LPVOID); |
| + INIT_ONCE_FUNC once_func; |
| + /* Windows XP / Server 2003 does not have InitOnceExecuteOnce */ |
| + once_func = (INIT_ONCE_FUNC)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), |
|
agl
2014/10/30 01:25:43
It seems that GetProcAddress might be a really exp
robert.bradford
2014/10/30 14:31:50
I've uploaded a revised version that saves the fun
|
| + "InitOnceExecuteOnce"); |
| + if (once_func) { |
| + once_func(&cpu_check_inited_once, _x86_check_features, NULL, NULL); |
| + } |
| +#endif /* (_WIN32_WINNT >= 0x0600) */ |
| +} |
| + |
| +#if (_WIN32_WINNT >= 0x0600) |
| +static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, PVOID param, PVOID *context) |
| +{ |
| + int x86_cpu_has_sse2; |
| + int x86_cpu_has_sse42; |
| + int x86_cpu_has_pclmulqdq; |
| + int regs[4]; |
| + |
| + __cpuid(regs, 1); |
| + |
| + x86_cpu_has_sse2 = regs[3] & 0x4000000; |
| + x86_cpu_has_sse42= regs[2] & 0x100000; |
| + x86_cpu_has_pclmulqdq = regs[2] & 0x2; |
| + |
| + x86_cpu_enable_simd = x86_cpu_has_sse2 && |
| + x86_cpu_has_sse42 && |
| + x86_cpu_has_pclmulqdq; |
| + return TRUE; |
| +} |
| +#endif /* (_WIN32_WINNT >= 0x0600) */ |
| +#endif /* _MSC_VER */ |