aboutsummaryrefslogtreecommitdiff
path: root/src/dolphin/CPUDetect.h
blob: bd4fd8d64521d83398696481aa276d1a0662793d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license_dolphin.txt file included.

// Detect the CPU, so we'll know which optimizations to use
#pragma once

#include <string>

enum class CPUVendor
{
  Intel,
  AMD,
  ARM,
  Other,
};

struct CPUInfo
{
  CPUVendor vendor = CPUVendor::Intel;

  char cpu_string[0x41] = {};
  char brand_string[0x21] = {};
  bool OS64bit = false;
  bool CPU64bit = false;
  bool Mode64bit = false;

  bool HTT = false;
  int num_cores = 0;
  int logical_cpu_count = 0;

  bool bSSE = false;
  bool bSSE2 = false;
  bool bSSE3 = false;
  bool bSSSE3 = false;
  bool bPOPCNT = false;
  bool bSSE4_1 = false;
  bool bSSE4_2 = false;
  bool bLZCNT = false;
  bool bSSE4A = false;
  bool bAVX = false;
  bool bAVX2 = false;
  bool bBMI1 = false;
  bool bBMI2 = false;
  bool bFMA = false;
  bool bFMA4 = false;
  bool bAES = false;
  // FXSAVE/FXRSTOR
  bool bFXSR = false;
  bool bMOVBE = false;
  // This flag indicates that the hardware supports some mode
  // in which denormal inputs _and_ outputs are automatically set to (signed) zero.
  bool bFlushToZero = false;
  bool bLAHFSAHF64 = false;
  bool bLongMode = false;
  bool bAtom = false;

  // ARMv8 specific
  bool bFP = false;
  bool bASIMD = false;
  bool bCRC32 = false;
  bool bSHA1 = false;
  bool bSHA2 = false;

  // Call Detect()
  explicit CPUInfo();

  // Turn the CPU info into a string we can show
  std::string Summarize();

private:
  // Detects the various CPU features
  void Detect();
};

extern CPUInfo cpu_info;