| The Gaudi Framework v27r1

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

Functions
instrset_detect.cpp File Reference
`#include "instrset.h"`
Include dependency graph for instrset_detect.cpp:

Go to the source code of this file.

## Functions
int | instrset_detect (void)
bool | hasFMA3 (void)
bool | hasFMA4 (void)
bool | hasXOP (void)

## Function Documentation

bool hasFMA3 | ( | void |  | ) |

Definition at line 133 of file instrset_detect.cpp.

133 {
134 if (instrset_detect() < 7) return false; // must have AVX
135 int abcd[4]; // cpuid results
136 cpuid(abcd, 1); // call cpuid function 1
137 return ((abcd[2] & (1 << 12)) != 0); // ecx bit 12 indicates FMA3
138 }
instrset_detect
int instrset_detect(void)
Definition: instrset_detect.cpp:91
cpuid
#define cpuid(func, eax, ebx, ecx, edx)
Definition: PfmCodeAnalyser.h:20

bool hasFMA4 | ( | void |  | ) |

Definition at line 141 of file instrset_detect.cpp.

141 {
142 if (instrset_detect() < 7) return false; // must have AVX
143 int abcd[4]; // cpuid results
144 cpuid(abcd, 0x80000001); // call cpuid function 0x80000001
145 return ((abcd[2] & (1 << 16)) != 0); // ecx bit 16 indicates FMA4
146 }
instrset_detect
int instrset_detect(void)
Definition: instrset_detect.cpp:91
cpuid
#define cpuid(func, eax, ebx, ecx, edx)
Definition: PfmCodeAnalyser.h:20

bool hasXOP | ( | void |  | ) |

Definition at line 149 of file instrset_detect.cpp.

149 {
150 if (instrset_detect() < 7) return false; // must have AVX
151 int abcd[4]; // cpuid results
152 cpuid(abcd, 0x80000001); // call cpuid function 0x80000001
153 return ((abcd[2] & (1 << 11)) != 0); // ecx bit 11 indicates XOP
154 }
instrset_detect
int instrset_detect(void)
Definition: instrset_detect.cpp:91
cpuid
#define cpuid(func, eax, ebx, ecx, edx)
Definition: PfmCodeAnalyser.h:20

int instrset_detect | ( | void |  | ) |

Definition at line 91 of file instrset_detect.cpp.

91 {
92
93 static int iset = -1; // remember value for next call
94 if (iset >= 0) {
95 return iset; // called before
96 }
97 iset = 0; // default value
98 int abcd[4] = {0,0,0,0}; // cpuid results
99 cpuid(abcd, 0); // call cpuid function 0
100 if (abcd[0] == 0) return iset; // no further cpuid function supported
101 cpuid(abcd, 1); // call cpuid function 1 for feature flags
102 if ((abcd[3] & (1 << 0)) == 0) return iset; // no floating point
103 if ((abcd[3] & (1 << 23)) == 0) return iset; // no MMX
104 if ((abcd[3] & (1 << 15)) == 0) return iset; // no conditional move
105 if ((abcd[3] & (1 << 24)) == 0) return iset; // no FXSAVE
106 if ((abcd[3] & (1 << 25)) == 0) return iset; // no SSE
107 iset = 1; // 1: SSE supported
108 if ((abcd[3] & (1 << 26)) == 0) return iset; // no SSE2
109 iset = 2; // 2: SSE2 supported
110 if ((abcd[2] & (1 << 0)) == 0) return iset; // no SSE3
111 iset = 3; // 3: SSE3 supported
112 if ((abcd[2] & (1 << 9)) == 0) return iset; // no SSSE3
113 iset = 4; // 4: SSSE3 supported
114 if ((abcd[2] & (1 << 19)) == 0) return iset; // no SSE4.1
115 iset = 5; // 5: SSE4.1 supported
116 if ((abcd[2] & (1 << 23)) == 0) return iset; // no POPCNT
117 if ((abcd[2] & (1 << 20)) == 0) return iset; // no SSE4.2
118 iset = 6; // 6: SSE4.2 supported
119 if ((abcd[2] & (1 << 27)) == 0) return iset; // no OSXSAVE
120 if ((xgetbv(0) & 6) != 6) return iset; // AVX not enabled in O.S.
121 if ((abcd[2] & (1 << 28)) == 0) return iset; // no AVX
122 iset = 7; // 7: AVX supported
123 cpuid(abcd, 7); // call cpuid leaf 7 for feature flags
124 if ((abcd[1] & (1 << 5)) == 0) return iset; // no AVX2
125 iset = 8; // 8: AVX2 supported
126 cpuid(abcd, 0xD); // call cpuid leaf 0xD for feature flags
127 if ((abcd[0] & 0x60) != 0x60) return iset; // no AVX512
128 iset = 9; // 8: AVX512F supported
129 return iset;
130 }
cpuid
#define cpuid(func, eax, ebx, ecx, edx)
Definition: PfmCodeAnalyser.h:20