summaryrefslogtreecommitdiff
path: root/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2011-10-17 05:33:10 +0000
committerCraig Topper <craig.topper@gmail.com>2011-10-17 05:33:10 +0000
commit4b2dc74d3f17b40a57eba3068ce498a7f30769fe (patch)
tree4af6049f024e484b185b6ffed96477f8dfc047db /lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
parent24bb92556614434a5c5c2246b19e71d85426cab3 (diff)
downloadllvm-4b2dc74d3f17b40a57eba3068ce498a7f30769fe.tar.gz
llvm-4b2dc74d3f17b40a57eba3068ce498a7f30769fe.tar.bz2
llvm-4b2dc74d3f17b40a57eba3068ce498a7f30769fe.tar.xz
Don't use inline assembly in 64-bit Visual Studio. Unfortunately, this means that cpuid leaf 7 can't be queried on versions of Visual Studio earlier than VS 2008 SP1. Fixes PR11147.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142177 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp')
-rw-r--r--lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp26
1 files changed, 10 insertions, 16 deletions
diff --git a/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
index 7cdd5b1b20..37984195b0 100644
--- a/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
+++ b/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
@@ -126,22 +126,16 @@ bool X86_MC::GetCpuIDAndInfoEx(unsigned value, unsigned subleaf, unsigned *rEAX,
"c" (subleaf));
return false;
#elif defined(_MSC_VER)
- // can't use __cpuidex because it isn't available in all supported versions
- // of MSC
- __asm {
- mov eax,value
- mov ecx,subleaf
- cpuid
- mov rsi,rEAX
- mov dword ptr [rsi],eax
- mov rsi,rEBX
- mov dword ptr [rsi],ebx
- mov rsi,rECX
- mov dword ptr [rsi],ecx
- mov rsi,rEDX
- mov dword ptr [rsi],edx
- }
- return false;
+ // __cpuidex was added in MSVC++ 9.0 SP1
+ #if (_MSC_VER > 1500) || (_MSC_VER == 1500 && _MSC_FULL_VER >= 150030729)
+ int registers[4];
+ __cpuidex(registers, value, subleaf);
+ *rEAX = registers[0];
+ *rEBX = registers[1];
+ *rECX = registers[2];
+ *rEDX = registers[3];
+ return false;
+ #endif
#endif
#elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
#if defined(__GNUC__)