CPU.cpp 980 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "CPU.h"
  2. #if defined(__x86_64__) || defined(__i386__)
  3. #include <cpuid.h>
  4. #endif
  5. #include "Log.h"
  6. #ifndef bit_AES
  7. #define bit_AES (1 << 25)
  8. #endif
  9. #ifndef bit_AVX
  10. #define bit_AVX (1 << 28)
  11. #endif
  12. namespace i2p
  13. {
  14. namespace cpu
  15. {
  16. bool aesni = false;
  17. bool avx = false;
  18. void Detect()
  19. {
  20. #if defined(__AES__) || defined(__AVX__)
  21. #if defined(__x86_64__) || defined(__i386__)
  22. int info[4];
  23. __cpuid(0, info[0], info[1], info[2], info[3]);
  24. if (info[0] >= 0x00000001) {
  25. __cpuid(0x00000001, info[0], info[1], info[2], info[3]);
  26. #ifdef __AES__
  27. aesni = info[2] & bit_AES; // AESNI
  28. #endif // __AES__
  29. #ifdef __AVX__
  30. avx = info[2] & bit_AVX; // AVX
  31. #endif // __AVX__
  32. }
  33. #endif // defined(__x86_64__) || defined(__i386__)
  34. #ifdef __AES__
  35. if(aesni)
  36. {
  37. LogPrint(eLogInfo, "AESNI enabled");
  38. }
  39. #endif // __AES__
  40. #ifdef __AVX__
  41. if(avx)
  42. {
  43. LogPrint(eLogInfo, "AVX enabled");
  44. }
  45. #endif // __AVX__
  46. #endif // defined(__AES__) || defined(__AVX__)
  47. }
  48. }
  49. }