Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * x86 feature check | |
| 3 * | |
| 4 * Copyright (C) 2013 Intel Corporation. All rights reserved. | |
| 5 * Author: | |
| 6 * Jim Kukunas | |
| 7 * | |
| 8 * For conditions of distribution and use, see copyright notice in zlib.h | |
| 9 */ | |
| 10 | |
| 11 #include "x86.h" | |
| 12 | |
| 13 int x86_cpu_enable_simd; | |
| 14 | |
| 15 #ifndef _MSC_VER | |
| 16 #include <pthread.h> | |
| 17 | |
| 18 pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT; | |
| 19 static void _x86_check_features(void); | |
| 20 | |
| 21 void x86_check_features(void) { | |
|
agl
2014/10/17 00:45:35
you've switched brace style and indentation here.
robert.bradford
2014/10/20 16:45:54
Done.
| |
| 22 pthread_once(&cpu_check_inited_once, _x86_check_features); | |
| 23 } | |
| 24 | |
| 25 static void _x86_check_features(void) | |
| 26 { | |
| 27 int x86_cpu_has_sse2; | |
| 28 int x86_cpu_has_sse42; | |
| 29 int x86_cpu_has_pclmulqdq; | |
| 30 unsigned eax, ebx, ecx, edx; | |
| 31 | |
| 32 eax = 1; | |
| 33 __asm__ __volatile__ ( | |
| 34 #ifdef __i386__ | |
|
agl
2014/10/17 00:45:34
I think it would be better to suffer a little dupl
robert.bradford
2014/10/20 16:45:54
Done.
| |
| 35 "xchg %%ebx, %1\n\t" | |
| 36 #endif | |
| 37 "cpuid\n\t" | |
| 38 #ifdef __i386__ | |
| 39 "xchg %1, %%ebx\n\t" | |
| 40 : "+a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx) | |
| 41 #else | |
| 42 : "+a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) | |
| 43 #endif | |
| 44 ); | |
| 45 | |
| 46 x86_cpu_has_sse2 = edx & 0x4000000; | |
| 47 x86_cpu_has_sse42 = ecx & 0x100000; | |
| 48 x86_cpu_has_pclmulqdq = ecx & 0x2; | |
| 49 | |
| 50 x86_cpu_enable_simd = x86_cpu_has_sse2 && | |
| 51 x86_cpu_has_sse42 && | |
| 52 x86_cpu_has_pclmulqdq; | |
| 53 } | |
| 54 #else | |
| 55 #include <intrin.h> | |
| 56 #include <windows.h> | |
| 57 | |
| 58 static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, PVOID param, PVOID *co ntext); | |
| 59 static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT; | |
| 60 | |
| 61 void x86_check_features(void) | |
| 62 { | |
| 63 #if (_WIN32_WINNT >= 0x0600) | |
| 64 InitOnceExecuteOnce(&cpu_check_inited_once, _x86_check_features, NULL, NULL); | |
| 65 #endif // (_WIN32_WINNT >= 0x0600) | |
|
agl
2014/10/17 00:45:35
ditto about two spaces.
robert.bradford
2014/10/20 16:45:54
Done.
| |
| 66 } | |
| 67 | |
| 68 #if (_WIN32_WINNT >= 0x0600) | |
| 69 static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, PVOID param, PVOID *co ntext) | |
| 70 { | |
| 71 int x86_cpu_has_sse2; | |
| 72 int x86_cpu_has_sse42; | |
| 73 int x86_cpu_has_pclmulqdq; | |
| 74 int regs[4]; | |
| 75 | |
| 76 __cpuid(regs, 1); | |
| 77 | |
| 78 x86_cpu_has_sse2 = regs[3] & 0x4000000; | |
| 79 x86_cpu_has_sse42= regs[2] & 0x100000; | |
| 80 x86_cpu_has_pclmulqdq = regs[2] & 0x2; | |
| 81 | |
| 82 x86_cpu_enable_simd = x86_cpu_has_sse2 && | |
| 83 x86_cpu_has_sse42 && | |
| 84 x86_cpu_has_pclmulqdq; | |
| 85 return TRUE; | |
| 86 } | |
| 87 #endif // (_WIN32_WINNT >= 0x0600) | |
|
agl
2014/10/17 00:45:35
nit: two spaces before "//"
Also, does VC++ accep
robert.bradford
2014/10/20 16:45:54
Well I did build it with the windows toolchain. Bu
| |
| 88 #endif | |
|
agl
2014/10/17 00:45:35
#endif // _MSC_VER
robert.bradford
2014/10/20 16:45:54
Done.
| |
| OLD | NEW |