Proper fix.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 17 Oct 2006 00:24:49 +0000 (00:24 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 17 Oct 2006 00:24:49 +0000 (00:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30993 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86Subtarget.cpp

index c26c1855d5e6318dbb2f0888b2fe0ca61b8300c7..804ba39f69a6bc032187e6fb6125f569744e5756 100644 (file)
@@ -32,16 +32,15 @@ AsmWriterFlavor("x86-asm-syntax", cl::init(X86Subtarget::unset),
 bool X86::GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX,
                           unsigned *rECX, unsigned *rEDX) {
 #if defined(__x86_64__)
-  unsigned long long saveRBX;
-  asm ("nop" : "=b" (saveRBX));
-  asm ("cpuid\n\t"
-       "movl\t%%ebx, %%esi\n\t"
+  // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually.
+  asm ("movq\t%%rbx, %%rsi\n\t"
+       "cpuid\n\t"
+       "xchgq\t%%rbx, %%rsi\n\t"
        : "=a" (*rEAX),
          "=S" (*rEBX),
          "=c" (*rECX),
          "=d" (*rEDX)
        :  "a" (value));
-  asm ("nop" :: "b" (saveRBX));
   return false;
 #elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
 #if defined(__GNUC__)