xref: /aosp_15_r20/external/libchrome/base/cpu.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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