diff options
author | Andrei Karas <akaras@inbox.ru> | 2013-06-08 19:37:53 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2013-06-09 15:21:24 +0300 |
commit | 2f7c62a4c312ae6c0d2c6ae52cb06a73c553c2c3 (patch) | |
tree | 47c039cbe54cb903ef4987fe0451efb3a7be0632 /src/utils/cpu.cpp | |
parent | 4fcd82d8ea4556236148a7be102ae9edc3ab58b7 (diff) | |
download | plus-2f7c62a4c312ae6c0d2c6ae52cb06a73c553c2c3.tar.gz plus-2f7c62a4c312ae6c0d2c6ae52cb06a73c553c2c3.tar.bz2 plus-2f7c62a4c312ae6c0d2c6ae52cb06a73c553c2c3.tar.xz plus-2f7c62a4c312ae6c0d2c6ae52cb06a73c553c2c3.zip |
Add cpu features detection.
Diffstat (limited to 'src/utils/cpu.cpp')
-rw-r--r-- | src/utils/cpu.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/utils/cpu.cpp b/src/utils/cpu.cpp new file mode 100644 index 000000000..bef0d653d --- /dev/null +++ b/src/utils/cpu.cpp @@ -0,0 +1,109 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "utils/cpu.h" + +#include "logger.h" + +#include "utils/stringutils.h" + +#include "resources/resourcemanager.h" + +#include "debug.h" + +int mCpuFlags = 0; + +void Cpu::detect() +{ +#ifdef __GNUC__ + __builtin_cpu_init(); + if (__builtin_cpu_supports ("mmx")) + mCpuFlags |= FEATURE_MMX; + if (__builtin_cpu_supports ("sse")) + mCpuFlags |= FEATURE_SSE; + if (__builtin_cpu_supports ("sse2")) + mCpuFlags |= FEATURE_SSE2; + if (__builtin_cpu_supports ("ssse3")) + mCpuFlags |= FEATURE_SSSE3; + if (__builtin_cpu_supports ("sse4.1")) + mCpuFlags |= FEATURE_SSE4; + if (__builtin_cpu_supports ("sse4.2")) + mCpuFlags |= FEATURE_SSE42; + printFlags(); +#elif defined(__linux__) || defined(__linux) + FILE *file = fopen("/proc/cpuinfo", "r"); + char buf[1001]; + if (!file) + return; + while (fgets(buf, 1000, file)) + { + std::string str = buf; + if (findFirst(str, "flags")) + { + size_t idx = str.find(":"); + if (idx == std::string::npos) + continue; + str = str.substr(idx + 1); + trim(str); + StringVect vect; + splitToStringVector(vect, str, ' '); + FOR_EACH (StringVectCIter, it, vect) + { + const std::string &flag = *it; + if (flag == "mmx") + mCpuFlags |= FEATURE_MMX; + else if (flag == "sse") + mCpuFlags |= FEATURE_SSE; + else if (flag == "sse2") + mCpuFlags |= FEATURE_SSE2; + else if (flag == "ssse3") + mCpuFlags |= FEATURE_SSSE3; + else if (flag == "sse4_1") + mCpuFlags |= FEATURE_SSE4; + else if (flag == "sse4_2") + mCpuFlags |= FEATURE_SSE42; + } + fclose(file); + printFlags(); + return; + } + } + fclose(file); + logger->log("cpu features was not detected"); +#endif +} + +void Cpu::printFlags() +{ + std::string str = "CPU features:"; + if (mCpuFlags & FEATURE_MMX) + str.append(" mmx"); + if (mCpuFlags & FEATURE_SSE) + str.append(" sse"); + if (mCpuFlags & FEATURE_SSE2) + str.append(" sse2"); + if (mCpuFlags & FEATURE_SSSE3) + str.append(" ssse3"); + if (mCpuFlags & FEATURE_SSE4) + str.append(" sse4"); + if (mCpuFlags & FEATURE_SSE42) + str.append(" sse4_2"); + logger->log(str); +} |