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
11b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifndef INCLUDE_LIBYUV_CPU_ID_H_
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;
34b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardstatic const int kCpuHasSSE42 = 0x100;  // unused at this time.
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;
40b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardstatic const int kCpuHasF16C = 0x4000;
41b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard
42b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard// 0x8000 reserved for future X86 flags.
43f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
44f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// These flags are only valid on MIPS processors.
45f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangstatic const int kCpuHasMIPS = 0x10000;
46f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangstatic const int kCpuHasDSPR2 = 0x20000;
47b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardstatic const int kCpuHasMSA = 0x40000;
4833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
4933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Internal function used to auto-init.
5033cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
5133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint InitCpuFlags(void);
5233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
5333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Internal function for parsing /proc/cpuinfo.
5433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
5533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint ArmCpuCaps(const char* cpuinfo_name);
567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
577cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// Detect CPU has SSE2 etc.
5833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Test_flag parameter should be one of kCpuHas constants above.
5933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// returns non-zero if instruction set is detected
6033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic __inline int TestCpuFlag(int test_flag) {
6133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  LIBYUV_API extern int cpu_info_;
62f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang  return (!cpu_info_ ? InitCpuFlags() : cpu_info_) & test_flag;
6333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// For testing, allow CPU flags to be disabled.
6633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// ie MaskCpuFlags(~kCpuHasSSSE3) to disable SSSE3.
6733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// MaskCpuFlags(-1) to enable all cpu specific optimizations.
68f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// MaskCpuFlags(1) to disable all cpu specific optimizations.
6933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
707cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordevoid MaskCpuFlags(int enable_flags);
717cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
7233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Low level cpuid for X86. Returns zeros on other CPUs.
73f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// eax is the info type that you want.
74f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// ecx is typically the cpu number, and should normally be zero.
7533cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
76f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangvoid CpuId(uint32 eax, uint32 ecx, uint32* cpu_info);
7733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
7833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifdef __cplusplus
7933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}  // extern "C"
807cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde}  // namespace libyuv
8133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
827cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
83b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif  // INCLUDE_LIBYUV_CPU_ID_H_
84