Don't use inline assembly in 64-bit Visual Studio. Unfortunately, this means that...
authorCraig Topper <craig.topper@gmail.com>
Mon, 17 Oct 2011 05:33:10 +0000 (05:33 +0000)
committerCraig Topper <craig.topper@gmail.com>
Mon, 17 Oct 2011 05:33:10 +0000 (05:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142177 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
lib/Target/X86/X86Subtarget.cpp

index 7cdd5b1b20f8aa3bf3e4415403a5b73895227339..37984195b097d3ec5f542ac31a83f33b5f23e791 100644 (file)
@@ -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__)
index c08dac9f999daa68ff460518f545084c3f8eb68a..45a8c2f1e81c3d3557ade642ab8179e73527adce 100644 (file)
@@ -278,14 +278,15 @@ void X86Subtarget::AutoDetectSubtargetFeatures() {
   }
 
   if (IsIntel && MaxLevel >= 7) {
-    X86_MC::GetCpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX);
-    if ((EBX >> 3) & 0x1) {
-      HasBMI = true;
-      ToggleFeature(X86::FeatureBMI);
-    }
-    if ((EBX >> 8) & 0x1) {
-      HasBMI2 = true;
-      ToggleFeature(X86::FeatureBMI2);
+    if (!X86_MC::GetCpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX)) {
+      if ((EBX >> 3) & 0x1) {
+        HasBMI = true;
+        ToggleFeature(X86::FeatureBMI);
+      }
+      if ((EBX >> 8) & 0x1) {
+        HasBMI2 = true;
+        ToggleFeature(X86::FeatureBMI2);
+      }
     }
   }
 }