cpu_id.h revision f047e7ca6983218eed7703c7afd51fed7bd3b5c9
17cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde/*
233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
37cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *
47cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  Use of this source code is governed by a BSD-style license
57cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  that can be found in the LICENSE file in the root of the source
67cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  tree. An additional intellectual property rights grant can be found
7f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *  in the file PATENTS. All contributing project authors may
87cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  be found in the AUTHORS file in the root of the source tree.
97cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde */
107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
1133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifndef INCLUDE_LIBYUV_CPU_ID_H_  // NOLINT
127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde#define INCLUDE_LIBYUV_CPU_ID_H_
137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
1433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#include "libyuv/basic_types.h"
1533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
1633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifdef __cplusplus
177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordenamespace libyuv {
1833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampextern "C" {
1933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
21f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// Internal flag to indicate cpuid requires initialization.
2233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuInitialized = 0x1;
237cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
2433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// These flags are only valid on ARM processors.
2533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasARM = 0x2;
2633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasNEON = 0x4;
2733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// 0x8 reserved for future ARM flag.
287cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
2933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// These flags are only valid on x86 processors.
3033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasX86 = 0x10;
3133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasSSE2 = 0x20;
3233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasSSSE3 = 0x40;
3333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasSSE41 = 0x80;
3433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasSSE42 = 0x100;
3533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasAVX = 0x200;
3633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic const int kCpuHasAVX2 = 0x400;
37f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangstatic const int kCpuHasERMS = 0x800;
38f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangstatic const int kCpuHasFMA3 = 0x1000;
39f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangstatic const int kCpuHasAVX3 = 0x2000;
40f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// 0x2000, 0x4000, 0x8000 reserved for future X86 flags.
41f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
42f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// These flags are only valid on MIPS processors.
43f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangstatic const int kCpuHasMIPS = 0x10000;
44f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangstatic const int kCpuHasDSPR2 = 0x20000;
4533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
4633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Internal function used to auto-init.
4733cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
4833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint InitCpuFlags(void);
4933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
5033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Internal function for parsing /proc/cpuinfo.
5133cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
5233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint ArmCpuCaps(const char* cpuinfo_name);
537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// Detect CPU has SSE2 etc.
5533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Test_flag parameter should be one of kCpuHas constants above.
5633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// returns non-zero if instruction set is detected
5733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic __inline int TestCpuFlag(int test_flag) {
5833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  LIBYUV_API extern int cpu_info_;
59f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang  return (!cpu_info_ ? InitCpuFlags() : cpu_info_) & test_flag;
6033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// For testing, allow CPU flags to be disabled.
6333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// ie MaskCpuFlags(~kCpuHasSSSE3) to disable SSSE3.
6433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// MaskCpuFlags(-1) to enable all cpu specific optimizations.
65f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// MaskCpuFlags(1) to disable all cpu specific optimizations.
6633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordevoid MaskCpuFlags(int enable_flags);
687cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
6933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Low level cpuid for X86. Returns zeros on other CPUs.
70f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// eax is the info type that you want.
71f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// ecx is typically the cpu number, and should normally be zero.
7233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
73f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangvoid CpuId(uint32 eax, uint32 ecx, uint32* cpu_info);
7433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
7533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifdef __cplusplus
7633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}  // extern "C"
777cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde}  // namespace libyuv
7833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
797cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
8033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif  // INCLUDE_LIBYUV_CPU_ID_H_  NOLINT
81