Files
MP-SPDZ/Tools/cpu_support.h
Marcel Keller 32950fe8d4 Maintenance.
2021-11-04 16:24:34 +11:00

80 lines
1.2 KiB
C++

/*
* cpu_support.h
*
*/
#ifndef TOOLS_CPU_SUPPORT_H_
#define TOOLS_CPU_SUPPORT_H_
#include <stdexcept>
inline bool check_cpu(int func, bool ecx, int feature)
{
#ifdef __aarch64__
(void) func, (void) ecx, (void) feature;
throw std::runtime_error("only for x86");
#else
int ax = func, bx, cx = 0, dx;
__asm__ __volatile__ ("cpuid":
"+a" (ax), "=b" (bx), "+c" (cx), "=d" (dx));
return ((ecx ? cx : bx) >> feature) & 1;
#endif
}
inline bool cpu_has_adx()
{
#ifdef CHECK_ADX
return check_cpu(7, false, 19);
#else
return true;
#endif
}
inline bool cpu_has_bmi2()
{
#ifdef CHECK_BMI2
return check_cpu(7, false, 8);
#else
return true;
#endif
}
inline bool cpu_has_avx2()
{
#ifdef CHECK_AVX2
return check_cpu(7, false, 5);
#else
return true;
#endif
}
inline bool cpu_has_avx(bool force = false)
{
(void) force;
#ifndef CHECK_AVX
if (force)
#endif
return check_cpu(1, true, 28);
return true;
}
inline bool cpu_has_pclmul()
{
#ifdef CHECK_PCLMUL
return check_cpu(1, true, 1);
#else
return true;
#endif
}
inline bool cpu_has_aes()
{
#ifdef CHECK_AES
return check_cpu(1, true, 25);
#else
return true;
#endif
}
#endif /* TOOLS_CPU_SUPPORT_H_ */