1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_CPU_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_CPU_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <string> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h" 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker namespace base { 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker // Query information about the processor. 15*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT CPU final { 16*635a8641SAndroid Build Coastguard Worker public: 17*635a8641SAndroid Build Coastguard Worker CPU(); 18*635a8641SAndroid Build Coastguard Worker 19*635a8641SAndroid Build Coastguard Worker enum IntelMicroArchitecture { 20*635a8641SAndroid Build Coastguard Worker PENTIUM, 21*635a8641SAndroid Build Coastguard Worker SSE, 22*635a8641SAndroid Build Coastguard Worker SSE2, 23*635a8641SAndroid Build Coastguard Worker SSE3, 24*635a8641SAndroid Build Coastguard Worker SSSE3, 25*635a8641SAndroid Build Coastguard Worker SSE41, 26*635a8641SAndroid Build Coastguard Worker SSE42, 27*635a8641SAndroid Build Coastguard Worker AVX, 28*635a8641SAndroid Build Coastguard Worker AVX2, 29*635a8641SAndroid Build Coastguard Worker MAX_INTEL_MICRO_ARCHITECTURE 30*635a8641SAndroid Build Coastguard Worker }; 31*635a8641SAndroid Build Coastguard Worker 32*635a8641SAndroid Build Coastguard Worker // Accessors for CPU information. vendor_name()33*635a8641SAndroid Build Coastguard Worker const std::string& vendor_name() const { return cpu_vendor_; } signature()34*635a8641SAndroid Build Coastguard Worker int signature() const { return signature_; } stepping()35*635a8641SAndroid Build Coastguard Worker int stepping() const { return stepping_; } model()36*635a8641SAndroid Build Coastguard Worker int model() const { return model_; } family()37*635a8641SAndroid Build Coastguard Worker int family() const { return family_; } type()38*635a8641SAndroid Build Coastguard Worker int type() const { return type_; } extended_model()39*635a8641SAndroid Build Coastguard Worker int extended_model() const { return ext_model_; } extended_family()40*635a8641SAndroid Build Coastguard Worker int extended_family() const { return ext_family_; } has_mmx()41*635a8641SAndroid Build Coastguard Worker bool has_mmx() const { return has_mmx_; } has_sse()42*635a8641SAndroid Build Coastguard Worker bool has_sse() const { return has_sse_; } has_sse2()43*635a8641SAndroid Build Coastguard Worker bool has_sse2() const { return has_sse2_; } has_sse3()44*635a8641SAndroid Build Coastguard Worker bool has_sse3() const { return has_sse3_; } has_ssse3()45*635a8641SAndroid Build Coastguard Worker bool has_ssse3() const { return has_ssse3_; } has_sse41()46*635a8641SAndroid Build Coastguard Worker bool has_sse41() const { return has_sse41_; } has_sse42()47*635a8641SAndroid Build Coastguard Worker bool has_sse42() const { return has_sse42_; } has_popcnt()48*635a8641SAndroid Build Coastguard Worker bool has_popcnt() const { return has_popcnt_; } has_avx()49*635a8641SAndroid Build Coastguard Worker bool has_avx() const { return has_avx_; } has_avx2()50*635a8641SAndroid Build Coastguard Worker bool has_avx2() const { return has_avx2_; } has_aesni()51*635a8641SAndroid Build Coastguard Worker bool has_aesni() const { return has_aesni_; } has_non_stop_time_stamp_counter()52*635a8641SAndroid Build Coastguard Worker bool has_non_stop_time_stamp_counter() const { 53*635a8641SAndroid Build Coastguard Worker return has_non_stop_time_stamp_counter_; 54*635a8641SAndroid Build Coastguard Worker } 55*635a8641SAndroid Build Coastguard Worker 56*635a8641SAndroid Build Coastguard Worker IntelMicroArchitecture GetIntelMicroArchitecture() const; cpu_brand()57*635a8641SAndroid Build Coastguard Worker const std::string& cpu_brand() const { return cpu_brand_; } 58*635a8641SAndroid Build Coastguard Worker 59*635a8641SAndroid Build Coastguard Worker private: 60*635a8641SAndroid Build Coastguard Worker // Query the processor for CPUID information. 61*635a8641SAndroid Build Coastguard Worker void Initialize(); 62*635a8641SAndroid Build Coastguard Worker 63*635a8641SAndroid Build Coastguard Worker int signature_; // raw form of type, family, model, and stepping 64*635a8641SAndroid Build Coastguard Worker int type_; // process type 65*635a8641SAndroid Build Coastguard Worker int family_; // family of the processor 66*635a8641SAndroid Build Coastguard Worker int model_; // model of processor 67*635a8641SAndroid Build Coastguard Worker int stepping_; // processor revision number 68*635a8641SAndroid Build Coastguard Worker int ext_model_; 69*635a8641SAndroid Build Coastguard Worker int ext_family_; 70*635a8641SAndroid Build Coastguard Worker bool has_mmx_; 71*635a8641SAndroid Build Coastguard Worker bool has_sse_; 72*635a8641SAndroid Build Coastguard Worker bool has_sse2_; 73*635a8641SAndroid Build Coastguard Worker bool has_sse3_; 74*635a8641SAndroid Build Coastguard Worker bool has_ssse3_; 75*635a8641SAndroid Build Coastguard Worker bool has_sse41_; 76*635a8641SAndroid Build Coastguard Worker bool has_sse42_; 77*635a8641SAndroid Build Coastguard Worker bool has_popcnt_; 78*635a8641SAndroid Build Coastguard Worker bool has_avx_; 79*635a8641SAndroid Build Coastguard Worker bool has_avx2_; 80*635a8641SAndroid Build Coastguard Worker bool has_aesni_; 81*635a8641SAndroid Build Coastguard Worker bool has_non_stop_time_stamp_counter_; 82*635a8641SAndroid Build Coastguard Worker std::string cpu_vendor_; 83*635a8641SAndroid Build Coastguard Worker std::string cpu_brand_; 84*635a8641SAndroid Build Coastguard Worker }; 85*635a8641SAndroid Build Coastguard Worker 86*635a8641SAndroid Build Coastguard Worker } // namespace base 87*635a8641SAndroid Build Coastguard Worker 88*635a8641SAndroid Build Coastguard Worker #endif // BASE_CPU_H_ 89