|  | /* | 
|  | *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | // Parts of this file derived from Chromium's base/cpu.cc. | 
|  |  | 
|  | #include "webrtc/system_wrappers/include/cpu_features_wrapper.h" | 
|  |  | 
|  | #if defined(WEBRTC_ARCH_X86_FAMILY) && defined(_MSC_VER) | 
|  | #include <intrin.h> | 
|  | #endif | 
|  |  | 
|  | #include "webrtc/typedefs.h" | 
|  |  | 
|  | // No CPU feature is available => straight C path. | 
|  | int GetCPUInfoNoASM(CPUFeature feature) { | 
|  | (void)feature; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | #if defined(WEBRTC_ARCH_X86_FAMILY) | 
|  | #ifndef _MSC_VER | 
|  | // Intrinsic for "cpuid". | 
|  | #if defined(__pic__) && defined(__i386__) | 
|  | static inline void __cpuid(int cpu_info[4], int info_type) { | 
|  | __asm__ volatile( | 
|  | "mov %%ebx, %%edi\n" | 
|  | "cpuid\n" | 
|  | "xchg %%edi, %%ebx\n" | 
|  | : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) | 
|  | : "a"(info_type)); | 
|  | } | 
|  | #else | 
|  | static inline void __cpuid(int cpu_info[4], int info_type) { | 
|  | __asm__ volatile( | 
|  | "cpuid\n" | 
|  | : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) | 
|  | : "a"(info_type)); | 
|  | } | 
|  | #endif | 
|  | #endif  // _MSC_VER | 
|  | #endif  // WEBRTC_ARCH_X86_FAMILY | 
|  |  | 
|  | #if defined(WEBRTC_ARCH_X86_FAMILY) | 
|  | // Actual feature detection for x86. | 
|  | static int GetCPUInfo(CPUFeature feature) { | 
|  | int cpu_info[4]; | 
|  | __cpuid(cpu_info, 1); | 
|  | if (feature == kSSE2) { | 
|  | return 0 != (cpu_info[3] & 0x04000000); | 
|  | } | 
|  | if (feature == kSSE3) { | 
|  | return 0 != (cpu_info[2] & 0x00000001); | 
|  | } | 
|  | return 0; | 
|  | } | 
|  | #else | 
|  | // Default to straight C for other platforms. | 
|  | static int GetCPUInfo(CPUFeature feature) { | 
|  | (void)feature; | 
|  | return 0; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | WebRtc_CPUInfo WebRtc_GetCPUInfo = GetCPUInfo; | 
|  | WebRtc_CPUInfo WebRtc_GetCPUInfoNoASM = GetCPUInfoNoASM; |