 Chromium Code Reviews
 Chromium Code Reviews Issue 678423002:
  Reland "Integrate SIMD optimisations for zlib"  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 678423002:
  Reland "Integrate SIMD optimisations for zlib"  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| 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 */ |