OSDN Git Service

Make it possible to set an extra PATH string for the new process, which (will be...
[mutilities/MUtilities.git] / src / CPUFeatures_Win32.cpp
index fe45cdb..1220744 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 // MuldeR's Utilities for Qt
-// Copyright (C) 2004-2014 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2016 LoRd_MuldeR <MuldeR2@GMX.de>
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 
 //MUtils
 #include <MUtils/CPUFeatures.h>
+#include <MUtils/OSSupport.h>
+#include "Utils_Win32.h"
 
-//Qt
-#include <QLibrary>
-
-MUtils::CPUFetaures::cpu_info_t MUtils::CPUFetaures::detect(const QStringList &argv)
+MUtils::CPUFetaures::cpu_info_t MUtils::CPUFetaures::detect(void)
 {
+       const OS::ArgumentMap &args = OS::arguments();
        typedef BOOL (WINAPI *IsWow64ProcessFun)(__in HANDLE hProcess, __out PBOOL Wow64Process);
 
        cpu_info_t features;
@@ -61,6 +61,13 @@ MUtils::CPUFetaures::cpu_info_t MUtils::CPUFetaures::detect(const QStringList &a
                if(CPUInfo[2] & 0x00000200) features.features |= FLAG_SSSE3;
                if(CPUInfo[2] & 0x00080000) features.features |= FLAG_SSE4;
                if(CPUInfo[2] & 0x00100000) features.features |= FLAG_SSE42;
+               if ((CPUInfo[2] & 0x18000000) == 0x18000000)
+               {
+                       if((_xgetbv(0) & 0x6ui64) == 0x6ui64) /*AVX requires OS support!*/
+                       {
+                               features.features |= FLAG_AVX;
+                       }
+               }
                features.stepping = CPUInfo[0] & 0xf;
                features.model    = ((CPUInfo[0] >> 4) & 0xf) + (((CPUInfo[0] >> 16) & 0xf) << 4);
                features.family   = ((CPUInfo[0] >> 8) & 0xf) + ((CPUInfo[0] >> 20) & 0xff);
@@ -92,19 +99,30 @@ MUtils::CPUFetaures::cpu_info_t MUtils::CPUFetaures::detect(const QStringList &a
        if(strlen(features.vendor) < 1) strncpy_s(features.vendor, 0x40, "Unknown", _TRUNCATE);
 
 #if (!(defined(_M_X64) || defined(_M_IA64)))
-       QLibrary Kernel32Lib("kernel32.dll");
-       if(IsWow64ProcessFun IsWow64ProcessPtr = (IsWow64ProcessFun) Kernel32Lib.resolve("IsWow64Process"))
+       const IsWow64ProcessFun isWow64ProcessPtr = MUtils::Win32Utils::resolve<IsWow64ProcessFun>(QLatin1String("kernel32"), QLatin1String("IsWow64Process"));
+       if(isWow64ProcessPtr)
        {
                BOOL x64flag = FALSE;
-               if(IsWow64ProcessPtr(GetCurrentProcess(), &x64flag))
+               if(isWow64ProcessPtr(GetCurrentProcess(), &x64flag))
                {
-                       features.x64 = (x64flag == TRUE);
+                       if(x64flag) features.x64 = true;
                }
        }
 #else
        features.x64 = true;
 #endif
 
+       if (features.x64)
+       {
+               features.features |= (FLAG_MMX | FLAG_SSE | FLAG_SSE2); /*x86_64 implies SSE2*/
+       }
+
+       if (!(features.features & FLAG_MMX))
+       {
+               qWarning("Warning: CPU does not seem to support MMX. Take care!\n");
+               features.features = 0;
+       }
+
        DWORD_PTR procAffinity, sysAffinity;
        if(GetProcessAffinityMask(GetCurrentProcess(), &procAffinity, &sysAffinity))
        {
@@ -119,16 +137,14 @@ MUtils::CPUFetaures::cpu_info_t MUtils::CPUFetaures::detect(const QStringList &a
                features.count = qBound(1UL, systemInfo.dwNumberOfProcessors, 64UL);
        }
 
-       if(argv.count() > 0)
+       bool userFlag = false;
+       if(args.contains("force-cpu-no-64bit")) { userFlag = true; features.x64 = false; }
+       if(args.contains("force-cpu-no-sse"  )) { userFlag = true; features.features &= (~(FLAG_SSE | FLAG_SSE2 | FLAG_SSE3 | FLAG_SSSE3 | FLAG_SSE4 | FLAG_SSE42)); }
+       if(args.contains("force-cpu-no-intel")) { userFlag = true; features.intel = false; }
+
+       if(userFlag)
        {
-               bool flag = false;
-               for(int i = 0; i < argv.count(); i++)
-               {
-                       if(!argv[i].compare("--force-cpu-no-64bit", Qt::CaseInsensitive)) { flag = true; features.x64 = false; }
-                       if(!argv[i].compare("--force-cpu-no-sse",   Qt::CaseInsensitive)) { flag = true; features.features &= (~(FLAG_SSE | FLAG_SSE2 | FLAG_SSE3 | FLAG_SSSE3 | FLAG_SSE4 | FLAG_SSE42)); }
-                       if(!argv[i].compare("--force-cpu-no-intel", Qt::CaseInsensitive)) { flag = true; features.intel = false; }
-               }
-               if(flag) qWarning("CPU flags overwritten by user-defined parameters. Take care!\n");
+               qWarning("CPU flags overwritten by user-defined parameters. Take care!\n");
        }
 
        return features;