Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
instrset_detect.cpp File Reference
#include "instrset.h"
Include dependency graph for instrset_detect.cpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int instrset_detect (void)
 
bool hasFMA3 (void)
 
bool hasFMA4 (void)
 
bool hasXOP (void)
 
bool hasF16C (void)
 
bool hasAVX512ER (void)
 

Function Documentation

bool hasAVX512ER ( void  )

Definition at line 178 of file instrset_detect.cpp.

178  {
179  if ( instrset_detect() < 9 ) return false; // must have AVX512F
180  int abcd[4]; // cpuid results
181  cpuid( abcd, 7 ); // call cpuid function 7
182  return ( ( abcd[1] & ( 1 << 27 ) ) != 0 ); // ebx bit 27 indicates AVX512ER
183  }
int instrset_detect(void)
#define cpuid(func, eax, ebx, ecx, edx)
bool hasF16C ( void  )

Definition at line 170 of file instrset_detect.cpp.

170  {
171  if ( instrset_detect() < 7 ) return false; // must have AVX
172  int abcd[4]; // cpuid results
173  cpuid( abcd, 1 ); // call cpuid function 1
174  return ( ( abcd[2] & ( 1 << 29 ) ) != 0 ); // ecx bit 29 indicates F16C
175  }
int instrset_detect(void)
#define cpuid(func, eax, ebx, ecx, edx)
bool hasFMA3 ( void  )

Definition at line 146 of file instrset_detect.cpp.

146  {
147  if ( instrset_detect() < 7 ) return false; // must have AVX
148  int abcd[4]; // cpuid results
149  cpuid( abcd, 1 ); // call cpuid function 1
150  return ( ( abcd[2] & ( 1 << 12 ) ) != 0 ); // ecx bit 12 indicates FMA3
151  }
int instrset_detect(void)
#define cpuid(func, eax, ebx, ecx, edx)
bool hasFMA4 ( void  )

Definition at line 154 of file instrset_detect.cpp.

154  {
155  if ( instrset_detect() < 7 ) return false; // must have AVX
156  int abcd[4]; // cpuid results
157  cpuid( abcd, 0x80000001 ); // call cpuid function 0x80000001
158  return ( ( abcd[2] & ( 1 << 16 ) ) != 0 ); // ecx bit 16 indicates FMA4
159  }
int instrset_detect(void)
#define cpuid(func, eax, ebx, ecx, edx)
bool hasXOP ( void  )

Definition at line 162 of file instrset_detect.cpp.

162  {
163  if ( instrset_detect() < 7 ) return false; // must have AVX
164  int abcd[4]; // cpuid results
165  cpuid( abcd, 0x80000001 ); // call cpuid function 0x80000001
166  return ( ( abcd[2] & ( 1 << 11 ) ) != 0 ); // ecx bit 11 indicates XOP
167  }
int instrset_detect(void)
#define cpuid(func, eax, ebx, ecx, edx)
int instrset_detect ( void  )

Definition at line 98 of file instrset_detect.cpp.

98  {
99 
100  static int iset = -1; // remember value for next call
101  if ( iset >= 0 ) {
102  return iset; // called before
103  }
104  iset = 0; // default value
105  int abcd[4] = {0, 0, 0, 0}; // cpuid results
106  cpuid( abcd, 0 ); // call cpuid function 0
107  if ( abcd[0] == 0 ) return iset; // no further cpuid function supported
108  cpuid( abcd, 1 ); // call cpuid function 1 for feature flags
109  if ( ( abcd[3] & ( 1 << 0 ) ) == 0 ) return iset; // no floating point
110  if ( ( abcd[3] & ( 1 << 23 ) ) == 0 ) return iset; // no MMX
111  if ( ( abcd[3] & ( 1 << 15 ) ) == 0 ) return iset; // no conditional move
112  if ( ( abcd[3] & ( 1 << 24 ) ) == 0 ) return iset; // no FXSAVE
113  if ( ( abcd[3] & ( 1 << 25 ) ) == 0 ) return iset; // no SSE
114  iset = 1; // 1: SSE supported
115  if ( ( abcd[3] & ( 1 << 26 ) ) == 0 ) return iset; // no SSE2
116  iset = 2; // 2: SSE2 supported
117  if ( ( abcd[2] & ( 1 << 0 ) ) == 0 ) return iset; // no SSE3
118  iset = 3; // 3: SSE3 supported
119  if ( ( abcd[2] & ( 1 << 9 ) ) == 0 ) return iset; // no SSSE3
120  iset = 4; // 4: SSSE3 supported
121  if ( ( abcd[2] & ( 1 << 19 ) ) == 0 ) return iset; // no SSE4.1
122  iset = 5; // 5: SSE4.1 supported
123  if ( ( abcd[2] & ( 1 << 23 ) ) == 0 ) return iset; // no POPCNT
124  if ( ( abcd[2] & ( 1 << 20 ) ) == 0 ) return iset; // no SSE4.2
125  iset = 6; // 6: SSE4.2 supported
126  if ( ( abcd[2] & ( 1 << 27 ) ) == 0 ) return iset; // no OSXSAVE
127  if ( ( xgetbv( 0 ) & 6 ) != 6 ) return iset; // AVX not enabled in O.S.
128  if ( ( abcd[2] & ( 1 << 28 ) ) == 0 ) return iset; // no AVX
129  iset = 7; // 7: AVX supported
130  cpuid( abcd, 7 ); // call cpuid leaf 7 for feature flags
131  if ( ( abcd[1] & ( 1 << 5 ) ) == 0 ) return iset; // no AVX2
132  iset = 8;
133  if ( ( abcd[1] & ( 1 << 16 ) ) == 0 ) return iset; // no AVX512
134  cpuid( abcd, 0xD ); // call cpuid leaf 0xD for feature flags
135  if ( ( abcd[0] & 0x60 ) != 0x60 ) return iset; // no AVX512
136  iset = 9;
137  cpuid( abcd, 7 ); // call cpuid leaf 7 for feature flags
138  if ( ( abcd[1] & ( 1 << 31 ) ) == 0 ) return iset; // no AVX512VL
139  iset = 10;
140  if ( ( abcd[1] & 0x40020000 ) != 0x40020000 ) return iset; // no AVX512BW, AVX512DQ
141  iset = 11;
142  return iset;
143  }
#define cpuid(func, eax, ebx, ecx, edx)