diff --git a/Source/Core/Common/Common.vcproj b/Source/Core/Common/Common.vcproj
index 03d5d9dbca..bdd518410d 100644
--- a/Source/Core/Common/Common.vcproj
+++ b/Source/Core/Common/Common.vcproj
@@ -659,6 +659,14 @@
RelativePath=".\Src\Thread.h"
>
+
+
+
+
diff --git a/Source/Core/Common/Src/ABI.h b/Source/Core/Common/Src/ABI.h
index feb4431531..2c6f59fac6 100644
--- a/Source/Core/Common/Src/ABI.h
+++ b/Source/Core/Common/Src/ABI.h
@@ -28,7 +28,7 @@
// * Caller fixes stack after call
// * function subtract from stack for local storage only.
// Scratch: EAX ECX EDX
-// Callee-save: EBX ESI EDI EBP
+// Callee-save: EBX ESI EDI EBP
// Parameters: -
// Windows 64-bit
@@ -103,6 +103,11 @@ void ABI_PopAllCalleeSavedRegsAndAdjustStack();
void ABI_PushAllCallerSavedRegsAndAdjustStack();
void ABI_PopAllCallerSavedRegsAndAdjustStack();
+#ifdef _M_IX86
+inline int ABI_GetNumXMMRegs() { return 8; }
+#else
+inline int ABI_GetNumXMMRegs() { return 16; }
+#endif
#endif // _JIT_ABI_H
diff --git a/Source/Core/Common/Src/CPUDetect.cpp b/Source/Core/Common/Src/CPUDetect.cpp
index 344b5b670e..298a9dfc51 100644
--- a/Source/Core/Common/Src/CPUDetect.cpp
+++ b/Source/Core/Common/Src/CPUDetect.cpp
@@ -21,7 +21,7 @@
//#include
#include
-void __cpuid(int info[4], int x) {}
+void __cpuid(int info[4], int x) {memset(info, 0, sizeof(info));}
#endif
@@ -72,94 +72,94 @@ void CPUInfoStruct::Detect()
isAMD = true;
}
- // Get the information associated with each valid Id
- for (unsigned int i = 0; i <= nIds; ++i)
+ if (nIds >= 2)
{
- __cpuid(CPUInfo, i);
+ // Get the information associated with each valid Id
+ __cpuid(CPUInfo, 1);
+
+ nSteppingID = CPUInfo[0] & 0xf;
+ nModel = (CPUInfo[0] >> 4) & 0xf;
+ nFamily = (CPUInfo[0] >> 8) & 0xf;
+ nProcessorType = (CPUInfo[0] >> 12) & 0x3;
+ nExtendedmodel = (CPUInfo[0] >> 16) & 0xf;
+ nExtendedfamily = (CPUInfo[0] >> 20) & 0xff;
+ nBrandIndex = CPUInfo[1] & 0xff;
+ nCLFLUSHcachelinesize = ((CPUInfo[1] >> 8) & 0xff) * 8;
+ nAPICPhysicalID = (CPUInfo[1] >> 24) & 0xff;
+ bSSE3 = (CPUInfo[2] & 0x1) || false;
+ bSSSE3 = (CPUInfo[2] & 0x200) || false;
+ bMONITOR_MWAIT = (CPUInfo[2] & 0x8) || false;
+ bCPLQualifiedDebugStore = (CPUInfo[2] & 0x10) || false;
+ bThermalMonitor2 = (CPUInfo[2] & 0x100) || false;
+ nFeatureInfo = CPUInfo[3];
- // Interpret CPU feature information.
- if (i == 1)
+ if (CPUInfo[2] & (1 << 23))
{
- nSteppingID = CPUInfo[0] & 0xf;
- nModel = (CPUInfo[0] >> 4) & 0xf;
- nFamily = (CPUInfo[0] >> 8) & 0xf;
- nProcessorType = (CPUInfo[0] >> 12) & 0x3;
- nExtendedmodel = (CPUInfo[0] >> 16) & 0xf;
- nExtendedfamily = (CPUInfo[0] >> 20) & 0xff;
- nBrandIndex = CPUInfo[1] & 0xff;
- nCLFLUSHcachelinesize = ((CPUInfo[1] >> 8) & 0xff) * 8;
- nAPICPhysicalID = (CPUInfo[1] >> 24) & 0xff;
- bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false;
- bSSSE3NewInstructions = (CPUInfo[2] & 0x200) || false;
- bMONITOR_MWAIT = (CPUInfo[2] & 0x8) || false;
- bCPLQualifiedDebugStore = (CPUInfo[2] & 0x10) || false;
- bThermalMonitor2 = (CPUInfo[2] & 0x100) || false;
- nFeatureInfo = CPUInfo[3];
+ bPOPCNT = true;
+ }
- if (CPUInfo[2] & (1 << 23))
- {
- bPOPCNT = true;
- }
+ if (CPUInfo[2] & (1 << 19))
+ {
+ bSSE4_1 = true;
+ }
- if (CPUInfo[2] & (1 << 19))
- {
- bSSE4_1 = true;
- }
-
- if (CPUInfo[2] & (1 << 20))
- {
- bSSE4_2 = true;
- }
+ if (CPUInfo[2] & (1 << 20))
+ {
+ bSSE4_2 = true;
}
}
- // Calling __cpuid with 0x80000000 as the InfoType argument
- // gets the number of valid extended IDs.
- __cpuid(CPUInfo, 0x80000000);
- nExIds = CPUInfo[0];
- memset(CPUBrandString, 0, sizeof(CPUBrandString));
-
- // Get the information associated with each extended ID.
- for (unsigned int i = 0x80000000; i <= nExIds; ++i)
+ if (bSSE3)
{
- __cpuid(CPUInfo, i);
+ // Only SSE3 CPU-s support extended infotypes
+ // Calling __cpuid with 0x80000000 as the InfoType argument
+ // gets the number of valid extended IDs.
+ __cpuid(CPUInfo, 0x80000000);
+ nExIds = CPUInfo[0];
+ memset(CPUBrandString, 0, sizeof(CPUBrandString));
- // Interpret CPU brand string and cache information.
- if (i == 0x80000001)
+ // Get the information associated with each extended ID.
+ for (unsigned int i = 0x80000000; i <= nExIds; ++i)
{
- // This block seems bugged.
- nFeatureInfo2 = CPUInfo[1]; // ECX
- bSSE5 = (nFeatureInfo2 & (1 << 11)) ? true : false;
- bLZCNT = (nFeatureInfo2 & (1 << 5)) ? true : false;
- bSSE4A = (nFeatureInfo2 & (1 << 6)) ? true : false;
- bLAHFSAHF64 = (nFeatureInfo2 & (1 << 0)) ? true : false;
+ __cpuid(CPUInfo, i);
- CPU64bit = (CPUInfo[2] & (1 << 29)) ? true : false;
- }
- else if (i == 0x80000002)
- {
- memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
- }
- else if (i == 0x80000003)
- {
- memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
- }
- else if (i == 0x80000004)
- {
- memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
- }
- else if (i == 0x80000006)
- {
- nCacheLineSize = CPUInfo[2] & 0xff;
- nL2Associativity = (CPUInfo[2] >> 12) & 0xf;
- nCacheSizeK = (CPUInfo[2] >> 16) & 0xffff;
- }
- else if (i == 0x80000008)
- {
- int numLSB = (CPUInfo[2] >> 12) & 0xF;
- numCores = 1 << numLSB;
- //int coresPerDie = CPUInfo[2] & 0xFF;
- // numCores = coresPerDie;
+ // Interpret CPU brand string and cache information.
+ if (i == 0x80000001)
+ {
+ // This block seems bugged.
+ nFeatureInfo2 = CPUInfo[1]; // ECX
+ bSSE5 = (nFeatureInfo2 & (1 << 11)) ? true : false;
+ bLZCNT = (nFeatureInfo2 & (1 << 5)) ? true : false;
+ bSSE4A = (nFeatureInfo2 & (1 << 6)) ? true : false;
+ bLAHFSAHF64 = (nFeatureInfo2 & (1 << 0)) ? true : false;
+
+ CPU64bit = (CPUInfo[2] & (1 << 29)) ? true : false;
+ }
+ else if (i == 0x80000002)
+ {
+ memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
+ }
+ else if (i == 0x80000003)
+ {
+ memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
+ }
+ else if (i == 0x80000004)
+ {
+ memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
+ }
+ else if (i == 0x80000006)
+ {
+ nCacheLineSize = CPUInfo[2] & 0xff;
+ nL2Associativity = (CPUInfo[2] >> 12) & 0xf;
+ nCacheSizeK = (CPUInfo[2] >> 16) & 0xffff;
+ }
+ else if (i == 0x80000008)
+ {
+ int numLSB = (CPUInfo[2] >> 12) & 0xF;
+ numCores = 1 << numLSB;
+ //int coresPerDie = CPUInfo[2] & 0xFF;
+ // numCores = coresPerDie;
+ }
}
}
@@ -222,9 +222,9 @@ void CPUInfoStruct::Detect()
nIds <<= 1;
bFXSAVE_FXRSTOR = (nFeatureInfo & nIds) ? true : false;
nIds <<= 1;
- bSSEExtensions = (nFeatureInfo & nIds) ? true : false;
+ bSSE = (nFeatureInfo & nIds) ? true : false;
nIds <<= 1;
- bSSE2Extensions = (nFeatureInfo & nIds) ? true : false;
+ bSSE2 = (nFeatureInfo & nIds) ? true : false;
nIds <<= 1;
bSelfSnoop = (nFeatureInfo & nIds) ? true : false;
nIds <<= 1;
diff --git a/Source/Core/Common/Src/CPUDetect.h b/Source/Core/Common/Src/CPUDetect.h
index 89ef2a7a71..389127261a 100644
--- a/Source/Core/Common/Src/CPUDetect.h
+++ b/Source/Core/Common/Src/CPUDetect.h
@@ -77,16 +77,16 @@ struct CPUInfoStruct
bool bThermalMonitorandClockCtrl;
bool bMMXTechnology;
bool bFXSAVE_FXRSTOR;
- bool bSSEExtensions;
- bool bSSE2Extensions;
- bool bSSE3NewInstructions;
- bool bSSSE3NewInstructions;
bool bSelfSnoop;
bool bHyper_threadingTechnology;
bool bThermalMonitor;
bool bUnknown4;
bool bPendBrkEN;
+ bool bSSE;
+ bool bSSE2;
+ bool bSSE3;
+ bool bSSSE3;
bool bPOPCNT;
bool bSSE4_1;
bool bSSE4_2;
diff --git a/Source/Core/Common/Src/SConscript b/Source/Core/Common/Src/SConscript
index 839e7382b1..5f215ab564 100644
--- a/Source/Core/Common/Src/SConscript
+++ b/Source/Core/Common/Src/SConscript
@@ -17,6 +17,7 @@ files = ["ABI.cpp",
"PortableSockets.cpp",
"StringUtil.cpp",
"TestFramework.cpp",
+ "Thunk.cpp",
"Timer.cpp",
"Thread.cpp",
"x64Emitter.cpp",
diff --git a/Source/Core/Common/Src/Thunk.cpp b/Source/Core/Common/Src/Thunk.cpp
new file mode 100644
index 0000000000..ed7d93bc99
--- /dev/null
+++ b/Source/Core/Common/Src/Thunk.cpp
@@ -0,0 +1,147 @@
+// Copyright (C) 2003-2008 Dolphin Project.
+
+// 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, version 2.0.
+
+// 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 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include