foobar2000 SDK  2015-08-03
cpuid.cpp
Go to the documentation of this file.
1 #include "pfc.h"
2 
3 
4 #if PFC_HAVE_CPUID
5 
6 namespace pfc {
7  bool query_cpu_feature_set(unsigned p_value) {
8 #ifdef _MSC_VER
9  __try {
10 #endif
12  int buffer[4];
13  __cpuid(buffer,1);
14  if (p_value & CPU_HAVE_SSE) {
15  if ((buffer[3]&(1<<25)) == 0) return false;
16  }
17  if (p_value & CPU_HAVE_SSE2) {
18  if ((buffer[3]&(1<<26)) == 0) return false;
19  }
20  if (p_value & CPU_HAVE_SSE3) {
21  if ((buffer[2]&(1<<0)) == 0) return false;
22  }
23  if (p_value & CPU_HAVE_SSSE3) {
24  if ((buffer[2]&(1<<9)) == 0) return false;
25  }
26  if (p_value & CPU_HAVE_SSE41) {
27  if ((buffer[2]&(1<<19)) == 0) return false;
28  }
29  if (p_value & CPU_HAVE_SSE42) {
30  if ((buffer[2]&(1<<20)) == 0) return false;
31  }
32  }
33  #ifdef _M_IX86
34  if (p_value & (CPU_HAVE_3DNOW_EX | CPU_HAVE_3DNOW)) {
35  int buffer_amd[4];
36  __cpuid(buffer_amd,0x80000000);
37  if ((unsigned)buffer_amd[0] < 0x80000001) return false;
38  __cpuid(buffer_amd,0x80000001);
39 
40  if (p_value & CPU_HAVE_3DNOW) {
41  if ((buffer_amd[3]&(1<<31)) == 0) return false;
42  }
43  if (p_value & CPU_HAVE_3DNOW_EX) {
44  if ((buffer_amd[3]&(1<<30)) == 0) return false;
45  }
46  }
47  #endif
48  return true;
49 #ifdef _MSC_VER
50  } __except(1) {
51  return false;
52  }
53 #endif
54  }
55 }
56 
57 #endif
bool query_cpu_feature_set(unsigned p_value)
Definition: cpuid.cpp:7