fix -fPIC compilation on i386
authorsgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 12 Jul 2012 12:57:07 +0000 (12:57 +0000)
committersgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 12 Jul 2012 12:57:07 +0000 (12:57 +0000)
Vc/src/cpuid.cpp

index 8edcb03..6bcda4d 100644 (file)
@@ -66,11 +66,23 @@ bool   CpuId::s_noL2orL3 = false;
         ecx = out[2]; \
         edx = out[3]; \
     } while (false)
+#elif defined(__i386__) && defined(__PIC__)
+// %ebx may be the PIC register.
+#define CPUID(leaf) \
+    __asm__("xchg{l} {%%}ebx, %1\n\t" \
+            "cpuid\n\t"               \
+            "xchg{l} {%%}ebx, %1\n\t" \
+            : "=a"(eax), "=r"(ebx), "=c"(ecx), "=d"(edx) : "a"(leaf))
+#define CPUID_C(leaf, _ecx_) \
+    __asm__("xchg{l} {%%}ebx, %1\n\t" \
+            "cpuid\n\t"               \
+            "xchg{l} {%%}ebx, %1\n\t" \
+            : "=a"(eax), "=r"(ebx), "=c"(ecx), "=d"(edx) : "a"(leaf), "c"(_ecx_))
 #else
 #define CPUID(leaf) \
-    __asm__("mov $" #leaf ",%%eax\n\tcpuid" : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx))
+    __asm__("cpuid" : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : "a"(leaf))
 #define CPUID_C(leaf, _ecx_) \
-    __asm__("mov $" #leaf ",%%eax\n\tcpuid" : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : "c"(_ecx_))
+    __asm__("cpuid" : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : "a"(leaf), "c"(_ecx_))
 #endif
 static unsigned int CpuIdAmdAssociativityTable(int bits)
 {