summaryrefslogtreecommitdiff
path: root/src/utils/cpu.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2013-06-08 19:37:53 +0300
committerAndrei Karas <akaras@inbox.ru>2013-06-09 15:21:24 +0300
commit2f7c62a4c312ae6c0d2c6ae52cb06a73c553c2c3 (patch)
tree47c039cbe54cb903ef4987fe0451efb3a7be0632 /src/utils/cpu.cpp
parent4fcd82d8ea4556236148a7be102ae9edc3ab58b7 (diff)
downloadplus-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.cpp109
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);
+}