[llvm] r188584 - Actually, use GNU inline asm for cpuid with clang

Reid Kleckner reid at kleckner.net
Fri Aug 16 15:42:42 PDT 2013


Author: rnk
Date: Fri Aug 16 17:42:42 2013
New Revision: 188584

URL: http://llvm.org/viewvc/llvm-project?rev=188584&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/Support/Host.cpp

Modified: llvm/trunk/lib/Support/Host.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?rev=188584&r1=188583&r2=188584&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Host.cpp (original)
+++ llvm/trunk/lib/Support/Host.cpp Fri Aug 16 17:42:42 2013
@@ -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
   #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





More information about the llvm-commits mailing list