diff options
author | Reid Kleckner <reid@kleckner.net> | 2013-08-16 22:42:42 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2013-08-16 22:42:42 +0000 |
commit | 0c1c5b0aaac80ca233523379617df93bbc0e2014 (patch) | |
tree | de538eca4741b2803d4d9da4a893236009337c42 /lib/Support/Host.cpp | |
parent | 586ea17be9fbf2fa1f2341900ebf1675a0924edc (diff) | |
download | external_llvm-0c1c5b0aaac80ca233523379617df93bbc0e2014.zip external_llvm-0c1c5b0aaac80ca233523379617df93bbc0e2014.tar.gz external_llvm-0c1c5b0aaac80ca233523379617df93bbc0e2014.tar.bz2 |
Actually, use GNU inline asm for cpuid with clang
Clang doesn't support the MSVC __cpuid intrinsic yet, and fixing that is
blocked on some fairly complicated issues.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188584 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/Host.cpp')
-rw-r--r-- | lib/Support/Host.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/lib/Support/Host.cpp b/lib/Support/Host.cpp index 9360cb9..ad0ac93 100644 --- a/lib/Support/Host.cpp +++ b/lib/Support/Host.cpp @@ -54,16 +54,7 @@ using namespace llvm; /// specified arguments. If we can't run cpuid on the host, return true. static bool GetX86CpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, unsigned *rECX, unsigned *rEDX) { -#if defined(_MSC_VER) - // The MSVC intrinsic is portable across x86 and x64. - int registers[4]; - __cpuid(registers, value); - *rEAX = registers[0]; - *rEBX = registers[1]; - *rECX = registers[2]; - *rEDX = registers[3]; - return false; -#elif defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) #if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64) // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually. asm ("movq\t%%rbx, %%rsi\n\t" @@ -90,6 +81,15 @@ static bool GetX86CpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, #else return true; #endif +#elif defined(_MSC_VER) + // The MSVC intrinsic is portable across x86 and x64. + int registers[4]; + __cpuid(registers, value); + *rEAX = registers[0]; + *rEBX = registers[1]; + *rECX = registers[2]; + *rEDX = registers[3]; + return false; #else return true; #endif |