Reland r247589: <webview>: Fix text selection features in mac.
[chromium-blink-merge.git] / third_party / libwebp / dsp / cpu.c
blob7a1f417a5566c003e0252d35d9bccc357720dfa0
1 // Copyright 2011 Google Inc. All Rights Reserved.
2 //
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the COPYING file in the root of the source
5 // tree. An additional intellectual property rights grant can be found
6 // in the file PATENTS. All contributing project authors may
7 // be found in the AUTHORS file in the root of the source tree.
8 // -----------------------------------------------------------------------------
9 //
10 // CPU detection
12 // Author: Christian Duvivier (cduvivier@google.com)
14 #include "./dsp.h"
16 #if defined(__ANDROID__)
17 #include <cpu-features.h>
18 #endif
20 //------------------------------------------------------------------------------
21 // SSE2 detection.
24 // apple/darwin gcc-4.0.1 defines __PIC__, but not __pic__ with -fPIC.
25 #if (defined(__pic__) || defined(__PIC__)) && defined(__i386__)
26 static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
27 __asm__ volatile (
28 "mov %%ebx, %%edi\n"
29 "cpuid\n"
30 "xchg %%edi, %%ebx\n"
31 : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
32 : "a"(info_type));
34 #elif defined(__i386__) || defined(__x86_64__)
35 static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
36 __asm__ volatile (
37 "cpuid\n"
38 : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
39 : "a"(info_type));
41 #elif defined(WEBP_MSC_SSE2)
42 #define GetCPUInfo __cpuid
43 #endif
45 #if defined(__i386__) || defined(__x86_64__) || defined(WEBP_MSC_SSE2)
46 static int x86CPUInfo(CPUFeature feature) {
47 int cpu_info[4];
48 GetCPUInfo(cpu_info, 1);
49 if (feature == kSSE2) {
50 return 0 != (cpu_info[3] & 0x04000000);
52 if (feature == kSSE3) {
53 return 0 != (cpu_info[2] & 0x00000001);
55 return 0;
57 VP8CPUInfo VP8GetCPUInfo = x86CPUInfo;
58 #elif defined(WEBP_ANDROID_NEON)
59 static int AndroidCPUInfo(CPUFeature feature) {
60 const AndroidCpuFamily cpu_family = android_getCpuFamily();
61 const uint64_t cpu_features = android_getCpuFeatures();
62 if (feature == kNEON) {
63 return (cpu_family == ANDROID_CPU_FAMILY_ARM &&
64 0 != (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON));
66 return 0;
68 VP8CPUInfo VP8GetCPUInfo = AndroidCPUInfo;
69 #elif defined(__ARM_NEON__)
70 // define a dummy function to enable turning off NEON at runtime by setting
71 // VP8DecGetCPUInfo = NULL
72 static int armCPUInfo(CPUFeature feature) {
73 (void)feature;
74 return 1;
76 VP8CPUInfo VP8GetCPUInfo = armCPUInfo;
77 #else
78 VP8CPUInfo VP8GetCPUInfo = NULL;
79 #endif