The Gaudi Framework  v30r3 (a5ef0a68)
instrset.h File Reference
#include <stdlib.h>
Include dependency graph for instrset.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  Const_int_t< n >
 
class  Const_uint_t< n >
 
class  Static_error_check< bool >
 
class  Static_error_check< false >
 

Macros

#define INSTRSET_H   125
 
#define INSTRSET   0
 
#define const_int(n)   ( Const_int_t<n>() )
 
#define const_uint(n)   ( Const_uint_t<n>() )
 

Typedefs

typedef signed char int8_t
 
typedef unsigned char uint8_t
 
typedef signed short int int16_t
 
typedef unsigned short int uint16_t
 
typedef signed int int32_t
 
typedef unsigned int uint32_t
 
typedef long long int64_t
 
typedef unsigned long long uint64_t
 
typedef int32_t intptr_t
 

Functions

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

Macro Definition Documentation

#define const_int (   n)    ( Const_int_t<n>() )

Definition at line 208 of file instrset.h.

#define const_uint (   n)    ( Const_uint_t<n>() )

Definition at line 209 of file instrset.h.

#define INSTRSET   0

Definition at line 52 of file instrset.h.

#define INSTRSET_H   125

Definition at line 21 of file instrset.h.

Typedef Documentation

typedef signed short int int16_t

Definition at line 138 of file instrset.h.

typedef signed int int32_t

Definition at line 140 of file instrset.h.

typedef long long int64_t

Definition at line 142 of file instrset.h.

typedef signed char int8_t

Definition at line 136 of file instrset.h.

typedef int32_t intptr_t

Definition at line 147 of file instrset.h.

typedef unsigned short int uint16_t

Definition at line 139 of file instrset.h.

typedef unsigned int uint32_t

Definition at line 141 of file instrset.h.

typedef unsigned long long uint64_t

Definition at line 143 of file instrset.h.

typedef unsigned char uint8_t

Definition at line 137 of file instrset.h.

Function Documentation

bool hasAVX512ER ( void  )

Definition at line 186 of file instrset_detect.cpp.

187  {
188  if ( instrset_detect() < 9 ) return false; // must have AVX512F
189  int abcd[4]; // cpuid results
190  cpuid( abcd, 7 ); // call cpuid function 7
191  return ( ( abcd[1] & ( 1 << 27 ) ) != 0 ); // ebx bit 27 indicates AVX512ER
192  }
int instrset_detect(void)
#define cpuid(func, eax, ebx, ecx, edx)
bool hasFMA3 ( void  )

Definition at line 150 of file instrset_detect.cpp.

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

Definition at line 159 of file instrset_detect.cpp.

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

Definition at line 168 of file instrset_detect.cpp.

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

Definition at line 101 of file instrset_detect.cpp.

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