diff options
author | Craig Topper <craig.topper@gmail.com> | 2011-10-17 05:33:10 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2011-10-17 05:33:10 +0000 |
commit | 4b2dc74d3f17b40a57eba3068ce498a7f30769fe (patch) | |
tree | 4af6049f024e484b185b6ffed96477f8dfc047db /lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp | |
parent | 24bb92556614434a5c5c2246b19e71d85426cab3 (diff) | |
download | llvm-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.cpp | 26 |
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__) |