Skip to content

Commit

Permalink
Add ASM detection for builds without libcpuid.
Browse files Browse the repository at this point in the history
  • Loading branch information
xmrig committed Oct 6, 2018
1 parent 8f3d405 commit ad92c3b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
25 changes: 23 additions & 2 deletions src/common/cpu/BasicCpuInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ static inline void cpuid(int level, int output[4]) {


static inline void cpu_brand_string(char* s) {
int cpu_info[4] = { 0 };
int32_t cpu_info[4] = { 0 };
cpuid(VENDOR_ID, cpu_info);

if (cpu_info[EAX_Reg] >= 4) {
Expand All @@ -86,19 +86,40 @@ static inline void cpu_brand_string(char* s) {

static inline bool has_aes_ni()
{
int cpu_info[4] = { 0 };
int32_t cpu_info[4] = { 0 };
cpuid(PROCESSOR_INFO, cpu_info);

return (cpu_info[ECX_Reg] & bit_AES) != 0;
}


xmrig::BasicCpuInfo::BasicCpuInfo() :
m_assembly(ASM_NONE),
m_aes(has_aes_ni()),
m_brand(),
m_threads(std::thread::hardware_concurrency())
{
cpu_brand_string(m_brand);

# ifndef XMRIG_NO_ASM
if (hasAES()) {
char vendor[13] = { 0 };
int32_t data[4] = { 0 };

cpuid(0, data);

memcpy(vendor + 0, &data[1], 4);
memcpy(vendor + 4, &data[3], 4);
memcpy(vendor + 8, &data[2], 4);

if (memcmp(vendor, "GenuineIntel", 12) == 0) {
m_assembly = ASM_INTEL;
}
else if (memcmp(vendor, "AuthenticAMD", 12) == 0) {
m_assembly = ASM_RYZEN;
}
}
# endif
}


Expand Down
4 changes: 2 additions & 2 deletions src/common/cpu/BasicCpuInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2016-2018 XMRig <https://github.com/xmrig>, <support@xmrig.com>
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
Expand Down Expand Up @@ -40,7 +39,7 @@ class BasicCpuInfo : public ICpuInfo
protected:
size_t optimalThreadsCount(size_t memSize, int maxCpuUsage) const override;

inline Assembly assembly() const override { return ASM_NONE; }
inline Assembly assembly() const override { return m_assembly; }
inline bool hasAES() const override { return m_aes; }
inline bool isSupported() const override { return true; }
inline const char *brand() const override { return m_brand; }
Expand All @@ -58,6 +57,7 @@ class BasicCpuInfo : public ICpuInfo
# endif

private:
Assembly m_assembly;
bool m_aes;
char m_brand[64];
int32_t m_threads;
Expand Down

0 comments on commit ad92c3b

Please sign in to comment.