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
77cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  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
2133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Internal flag to indicate cpuid is initialized.
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;
3733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
3833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Internal function used to auto-init.
3933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
4033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint InitCpuFlags(void);
4133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
4233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Internal function for parsing /proc/cpuinfo.
4333cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
4433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint ArmCpuCaps(const char* cpuinfo_name);
457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
467cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// Detect CPU has SSE2 etc.
4733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Test_flag parameter should be one of kCpuHas constants above.
4833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// returns non-zero if instruction set is detected
4933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampstatic __inline int TestCpuFlag(int test_flag) {
5033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  LIBYUV_API extern int cpu_info_;
5133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  return (cpu_info_ ? cpu_info_ : InitCpuFlags()) & test_flag;
5233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}
537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// For testing, allow CPU flags to be disabled.
5533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// ie MaskCpuFlags(~kCpuHasSSSE3) to disable SSSE3.
5633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// MaskCpuFlags(-1) to enable all cpu specific optimizations.
5733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// MaskCpuFlags(0) to disable all cpu specific optimizations.
5833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordevoid MaskCpuFlags(int enable_flags);
607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
6133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Low level cpuid for X86. Returns zeros on other CPUs.
6233cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
6333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampvoid CpuId(int cpu_info[4], int info_type);
6433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
6533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifdef __cplusplus
6633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}  // extern "C"
677cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde}  // namespace libyuv
6833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
697cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
7033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif  // INCLUDE_LIBYUV_CPU_ID_H_  NOLINT
71